在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