[前言] 如果是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