• Entity Freamwork CodeFirst 连接PostgreSql数据库


    EF的Code First是一个比较强大也比较有用的功能,他可以让你先写代码,最后根据代码去生成数据库,非常符合OO设计的要求,抛开数据库层面不管(当然不是完全的不管),只管对象的设计。

    首先,说一下我做测试的环境:EF 6.0/PostgreSql 9.2

    第一步:添加程序对EF的引用,有个偷懒的办法是,添加一个空的Code Fist ADO.NET实体数据模型,这样,VS会自动帮你添加对EF以及相关的DLL的引用

    第二步:用Nuget添加对Npgsql For Entity Freamwork的引用,这样子的话,Nuget会自动帮你添加NpgSql和NpgSql.EntityFreamWork的引用,并且会对你的Config文件中添加配置。

    2016年3月21日更新:先通过Nuget添加对EntityFramework6.Npgsql的引用

    第三步:配置Config文件

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <configuration>
     3   <configSections>
     4     <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
     5   </configSections>
     6   <startup>
     7     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
     8   </startup>
     9   <entityFramework>
    10     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
    11       <parameters>
    12         <parameter value="v11.0" />
    13       </parameters>
    14     </defaultConnectionFactory>
    15     <providers>
    16       <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" />
    17     </providers>
    18   </entityFramework>
    19   <system.data>
    20     <DbProviderFactories>
    21       <remove invariant="Npgsql"/>
    22       <add name="Npgsql Data Provider" invariant="Npgsql" description=".Net Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.2.3.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" support="FF" />
    23     </DbProviderFactories>
    24   </system.data>
    25   <connectionStrings>
    26     <add name="ConnectionStr" connectionString="server=127.0.0.1;port=5432;Database=test;uid=*****;pwd=*****" providerName="Npgsql" />
    27   </connectionStrings>
    28 </configuration>
    Config

    在这个过程中,我对几个地方有了比较清楚的认识:

    1.<add name="ConnectionStr" connectionString="server=127.0.0.1;port=5432;Database=test;uid=postgres;pwd=baixu963." providerName="Npgsql" /> 在这句里面,ProviderName要填写的就是访问数据库的ADO.NET命名空间,比如Sqlserver就是System.Data.SqlClient,MySql就应该是:MySql.Data.MySqlClient,.net访问PostgreSql是由开源项目Npgsql提供的驱动程序,命名空间也是NpgSql,所以,这里的providerName="Npgsql"。

    2.在WebConfig中,configSections节点一定要在第一个,不要乱改动他的位置。

    3.DbProviderFactories节点:中文含义:数据库供应商工厂,这也是为.net访问数据库提供的一个配置,因为这是微软搞出来的,他对SqlServer的支持,都已经给过默认值了,所以我们平时配置Sqlserver的时候不需要管,但是配置别的一些数据库,那就需要修改了。其中,最重要的就是invariant这个东西了,这个对应的也是数据库的ADO.NET驱动的命名空间。还有Type也需要注意,下面再给出MySql的写法:

    1 <DbProviderFactories>
    2             <add name="MySQL Data Provider"
    3                  invariant="MySql.Data.MySqlClient"
    4                  description=".Net Framework Data Provider for MySQL"
    5                  type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=5.2.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
    6         </DbProviderFactories>
    MySql DbProviderFactories

    配置文件就到这里吧,下面开始代码的部分。

    首先,给出一个Person类:

    1  public class Person
    2     {
    3         [Key]
    4         public int Id { get; set; }
    5         [StringLength(32)]
    6         public string Name { get; set; }
    7     }
    Person

    Id上面的特性标签Key代表这是一个主键,Name上面的StringLength是告诉数据库,这个字段是32个长度。

    然后,新建一个DbContext(如果你刚才是通过新建空的Code Fist ADO.NET实体数据模型引用的EF,他会自动帮你建一个Demo出来,你可以直接改那个),不多解释了,直接上代码,

    public class EfDbContext : DbContext
    {
    public EfDbContext()
    : base("name=ConnectionStr")
    {

    }
    public virtual DbSet<Person> Person { get; set; }
    }

    其中Name对应的值是数据库中的连接字符串所对应的Name,然后下面的DbSet<T>就对应着数据库中的一个表,注意这个DbSet一定要是Virtual,EF需要去重写它。

    基本的咱们已经写完了,咱们来试试,我这是控制台程序,所以直接是控制台的代码啦,你们随意。

     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             EfDbContext context=new EfDbContext();
     6             Person person=new Person();
     7             person.Name = "baiyunchen";
     8             context.Person.Add(person);
     9             context.SaveChanges();
    10             var p = context.Person.FirstOrDefault(x => x.Name == "baiyunchen") ?? new Person();
    11             Console.WriteLine(p.Name);
    12             Console.ReadKey();
    13         }
    14     }
    Test Code

    等待他输出了P的名字之后,再去看数据库,他已经帮忙自动建库,建表,插入数据,一切OK了。

    比较奇怪的是,他新建了个People表,后面我强制给Person类加了[Table="Person"]这样才给我建了Person表,不知道是不是跟哪个关键字冲突了。

    另外,我发现,EF在你实体变动了之后,你如果需要处理,会变得异常的麻烦。先写到这里,我得继续研究研究EF了。

  • 相关阅读:
    单变量微积分笔记19——数值积分
    单变量微积分笔记18——定积分的应用3(均值、权重、概率)
    同桌的你
    单变量微积分笔记17——定积分的应用2(体积)
    连通问题
    疯狂!!!
    单变量微积分笔记16——定积分的应用1(对数与面积)
    概率笔记1——独立事件下的简单概率
    上传图片流到服务器(AFN方法) (多张图片)(图片流)
    iOS开发通过AFNetworking上传图片到服务器
  • 原文地址:https://www.cnblogs.com/baiyunchen/p/4132989.html
Copyright © 2020-2023  润新知