Code First 顧名思義就是先代碼,再由代碼生成數據庫的開發方式。
廢話不多說,直接來一發看看:
在VS2010里新建一個空白解決方案,再依次添加兩個類庫項目:Model、DataAccess和一個控制台項目BreakAwayConsole。分別是實體、數據訪問、控制台顯示。
項目結構圖:
詳細介紹:
1.實體類Model
本類庫下有兩個類:Lodging(住宿類)、Destination(景點類)
Lodging類定義:
/// <summary>
/// 住宿類
/// </summary>
public class Lodging { public int LodgingId { get; set; } public string Name { get; set; } public string Owner { get; set; } public bool IsResort { get; set; } //是否度假勝地 public Destination Destination { get; set; } }
跟以往實體類的定義多了一個導航屬性Destination。它是EF中指定主外鍵關系用的,后續演示Fluent API和Data Annotation配置實體關系會大面積用到。
下面是Destination類定義:
/// <summary>
/// 景點類
/// </summary>
public class Destination { public int DestinationId { get; set; } public string Name { get; set; } public string Country { get; set; } public string Description { get; set; } public byte[] Photo { get; set; } public List<Lodging> Lodgings { get; set; } }
同樣有個導航屬性,跟上面的不同,這是一個List集合類型的。通俗點理解:Destination包括很多(List)個Lodging,就是一個景點(Destination)有很多住宿(Lodging)的地方,所以Destination類里是:List<Lodging> Lodgings;而一個住宿(Lodging)的地方只能在一個景點(Destination),所以住宿類Lodging里的導航屬性就是Destination的,而不是List<Destination>。
2.數據訪問DataAccess
本類庫需要引用EntityFramework,同時需要添加引用並在類中using System.Data.Entity,還需要添加對Model類的引用
EF訪問數據庫是通過數據庫上下文對數據庫進行CRUD(增查改刪)的,所以我們新建一個繼承DbContext的數據庫訪問類BreakAwayContext:
public class BreakAwayContext : DbContext { //以下是數據庫上下文對象,以后對數據庫的訪問就用下面對象 public DbSet<CodeFirst.Model.Destination> Destinations { get; set; } public DbSet<CodeFirst.Model.Lodging> Lodgings { get; set; } }
本類就是數據庫上下文訪問類,以后每添加一個實體,都需要添加進來。
3.控制台BreakAwayConsole
此層需要設置為啟動項目(右鍵 - 設為啟動項目)
Program類需要添加如下引用:Model、DataAccess類庫和EntityFramework
然后為Program.cs添加一個方法:
private static void InsertDestination() { var destination = new CodeFirst.Model.Destination { Country = "Indonesia", Description = "EcoTourism at its best in exquisite Bali", Name = "Bali" }; using (var context = new CodeFirst.DataAccess.BreakAwayContext()) { context.Destinations.Add(destination); context.SaveChanges(); } }
簡單的linq寫法,向數據庫的Destination表里插入一條數據。然后在Main方法里調用InsertDestination方法。
后期我們肯定要不停的修改Model里的實體類,所以在Main方法里加上一句:
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<CodeFirst.DataAccess.BreakAwayContext>());
意思就是:如果實體類有變化就重新生成一下數據庫(DropCreateDatabaseIfModelChanges)。使用這個方法又得添加引用:using System.Data.Entity;
一切就緒后,我們F5運行下控制台項目,看能不能根據實體類代碼生成對應的數據庫並通過上下文對象向數據庫中插入一條數據
靜靜等待幾秒鍾,報了一個ProviderIncompatibleException的錯,如圖:
意思就是找不到數據庫。EF4.1默認的數據庫是:.\SQLEXPRESS,如果本地沒有SQLEXPRESS,EF會嘗試LocalDb\v11.0(包含在VS2012中)
演示demo配套使用的數據庫是sql 2008企業版,所以必須在配置文件里指定數據庫,為控制台項目添加一個配置文件App.Config:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="BreakAwayContext" providerName="System.Data.SqlClient" connectionString="Server=.;Database=BreakAwayConfigFile;Trusted_Connection=True"/> <add name="My_Test" providerName="System.Data.SqlClient" connectionString="Server=.;Database=MyBreakAwayDb;Trusted_Connection=true" /> </connectionStrings> </configuration>
我們寫了兩個節點,name值分別為BreakAwayContext和My_Test,BreakAwayContext和數據庫上下文類名稱完全一樣,我們轉到BreakAwayContet類並添加構造函數,讓上下文能找到數據庫:
public BreakAwayContext(): base("name=BreakAwayContext") { }
注意:name=BreakAwayContext可以不寫,因為默認就是找配置文件里name和本類名稱一致的數據庫連接串,即BreakAwayContext,那么生成的數據庫就是配置文件里對應節點指定的:BreakAwayConfigFile。如果要指定找特定數據庫連接字符串,那直接修改name=My_Test即可,這樣就找配置文件里第二個數據庫連接字符串了,生成的數據庫自然就是:MyBreakAwayDb。簡單明了。
當然EF中還有其他找數據庫連接字符串的方法,比如:DbConnection、連接工廠等,具體請自行學習,這里只介紹最常用的。
此時,我們再運行下程序就能正確的生成數據庫了:
注意觀察會發現:多生成了一張EdmMetadata表,這是監控實體類變化的表,后續文章會有介紹。
同時,EF為每張表都生成了主鍵,同時也設置了對應的外鍵關系。(主鍵是EF的默認的映射規則,外鍵是因為我們給實體類加上了導航屬性)。其他所有字段都是默認的可空類型,大小也是默認的max。當然,項目中肯定不會讓每個字段都是可空的,后續文章會演示如何配置這些字段。
ok,本文到此結束,Demo隨下篇文章一起放出。下篇文章講EF里的默認映射以及如何使用Data Annotations和Fluent API配置數據庫的映射。
3ks 4 reading
EF Code First 系列文章導航: