[前言] 如果是Code First老鳥或者對Entity Framework不感興趣,就不用浪費時間往下看了。
記得09年第一次接觸ORM————Linq2Sql,從此對她的愛便一發不可收拾,一年后,新的工作用上了EF,突然感覺彷佛是生活中出現了一個與你的愛人一樣優秀但卻沒有你愛人缺點的Girl,真的難以抗拒。后來又因為各種緣故,接觸EF越來越少,直到最近沒那么忙才重拾EF。
關於EF我就不廢話了,如果是EF新人(對Code First而言我也絕對是個新人),個人覺得還是從Code First去學吧。
瞎謅結束,以下為本文主題。
由於園子里關於EF的介紹已經有很多,但是本人做Code First還是走了不少曲折之路(主要在Code=>DB),故而編寫本文分享。在Code First中,編寫完代碼並運行之后,我們的Model會同步到Db中,但是往往我們需要的是編寫完Model就生成數據庫,而不是等UI部分完成並運行之后才看到數據庫,借助NuGet程序包管理器可以讓我們即時完成Code=>DB。
准備:1.本人開發工具為VS2012,使用的是.NET Framework 4.5(EF5);
2.然后確保已在VS擴展中安裝了最新的“NuGet程序包管理器”;
3.常用的三行NuGet用於EF命令(當然可以直接用命令“get-help EntityFramework”獲取):“Enable-Migrations” --在對應項目中啟用、“Add-Migration <名稱>” --搭建基架、“Update-Database” --提交(應用基於代碼的遷移)
4.新建類庫項目“CodeFirst”。
開始:
1.在vs打開“程序包管理控制台”,輸入“get-help NuGet”回車,可以查看一些命令。
2. 在程序包管理控制台輸入“Install-Package EntityFramework”,此過程必須保證機子聯網,如未聯網,本人有個法子,就是在項目中新建Entity Framework(如“ADO.NET實體數據模型”)項,然后再刪除該項即可。上述命令執行前確保如下圖所示說明
此時可以看到項目多了個文件“packages.config”,同樣在引用下多了“EntityFramework”的程序集。而在解決方案目錄下則多了文件夾“packages”(物理目錄,非解決方案目錄),假如我們要拷貝項目,則應連同該目錄拷貝,否則到別的目錄下再編譯項目之前仍然重新需要執行“Install-Package EntityFramework”,這是在將解決方案添加到源碼管理時需要注意的地方。
3.項目下添加項目文件夾“Models”,並在該文件夾編寫以下三個類與一個枚舉(EF5對枚舉的支持是非常棒的):

/// <summary> /// 性別 /// </summary> public enum Gender { Female = 0, Male, LadyBoy }

/// <summary> /// 人名 /// </summary> public class PersonName { public string FirstName { get; set; } public string LastName { get; set; } public string FullName { get { return string.Format("{0} {1}", FirstName, LastName); } } }

public abstract class BaseModel { public BaseModel() { this.CreatedTime = DateTime.Now; this.LastUpdatedTime = DateTime.Now; } public DateTime CreatedTime { get; set; } public string Creater { get; set; } public DateTime LastUpdatedTime { get; set; } public string LastUpdater { get; set; } }

[Table("UserInfo")] public class UserModel : BaseModel { [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public string LoginName { get; set; } [MaxLength(50)] public string Password { get; set; } public int Age { get; set; } public Gender Gender { get; set; } public DateTime? LastLoginTime { get; set; } public PersonName Name { get; set; } }
4.在項目下繼續新建類“CodeFirstDbContext”

public class CodeFirstDbContext : DbContext { public DbSet<UserModel> Users { get; set; } public CodeFirstDbContext() : base("DefautConnection") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<UserModel>(); } }
5.在“程序包管理控制台”(注意第二步截圖中所說的,以下關於NuGet命令均必須如此),輸入“Enable-Migrations”回車,項目多了Migrations目錄。
6.在解決方案下新建控制台項目“ConsoleUI”,再在該項目下新建文件夾“App_Data”(此步驟非必須,我系統未安裝SQL Server,因而我將使用數據庫文件,文件則位於當前剛創建的目錄下)。
7.在DbContext所在的項目CodeFirst下的App.config下添加如下節點(注意不要添加到configSections節點之前)
<connectionStrings> <add name="DefautConnection" connectionString="data source=(LocalDB)\v11.0;attachdbfilename=H:\shuju\VS2012\CodeFirst\ConsoleUI\App_Data\CodeFirstDb.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> </connectionStrings>
8.在“程序包管理控制台”輸入命令“Enable-Migrations”,保證無錯誤提示,繼續輸入“Add-Migration CreateDb”,注意CreateDb可由咱們自行定義。
此時VS生成了一個名字很長的cs文件,可以看到其為咱們創建數據表的代碼,EF對枚舉、復雜類型、實體繼承都提供了非常棒的知識,我們此時可以修改相應代碼以生成我們希望看到的表結構。
9.編寫控制台程序以驗證我們的程序(注意添加引用並添加app.config添加數據連接字符串)。

public static void Main() { UserModel model = new UserModel { Age = 27, Creater = "me", Gender = Gender.LadyBoy, LastUpdater = "me", LoginName = "admin", Name = new PersonName { FirstName = "san", LastName = "zhang" }, Password = "1234" }; using (CodeFirstDbContext context = new CodeFirstDbContext()) { context.Users.Add(model); context.SaveChanges(); }; Console.WriteLine("成功添加用戶,接下來將獲取。。。"); using (CodeFirstDbContext context = new CodeFirstDbContext()) { UserModel getModel = context.Users.FirstOrDefault(); Console.WriteLine("名字:{0},性別:{1},創建時間:{2}" , getModel.Name.FullName, getModel.Gender, getModel.CreatedTime); }; Console.Read(); }
10.收工。
完成之后就感覺很容易,由於我之前機子未聯網而在做demo時頗費周折。在來看看我們用到的NuGet命令:
Install-Package EntityFramework
Enable-Migrations
Add-Migration
Update-Database