在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:shujuVS2012CodeFirstConsoleUIApp_DataCodeFirstDb.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