標籤:des style blog http io ar color os sp
EF的Code First是一個比較強大也比較有用的功能,他可以讓你先寫代碼,最後根據代碼去產生資料庫,非常符合OO設計的要求,拋開資料庫層面不管(當然不是完全的不管),只管對象的設計。
首先,說一下我做測試的環境:EF 6.0/PostgreSql 9.2
前提:電腦上裝好了PostgreSql資料庫以及配置好ODBC資料來源,以確保電腦對PostgreSql的支援。
第一步:添加程式對EF的引用,有個偷懶的辦法是,添加一個空的Code Fist ADO.NET實體資料模型,這樣,VS會自動幫你添加對EF以及相關的DLL的引用
第二步:用Nuget添加對Npgsql For Entity Freamwork的引用,這樣子的話,Nuget會自動幫你添加NpgSql和NpgSql.EntityFreamWork的引用,並且會對你的Config檔案中添加配置。
第三步:配置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 Person2 {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了。
Entity Freamwork CodeFirst 串連PostgreSql資料庫