[C#.NET][Entity Framework] 初探 Code First Migration
當我們在使用 Code First 時,若已經產生資料庫,再去修改屬性就會拋出例外
The model backing the 'CustomerDbContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).
這時就必須要使用Migration
若你的專案跟我一樣符合下列條件,你可以這樣做:
- DbContext 寫在App專案裡
- Localdb 已經有資料了
以下內容必須擁有一些基本知識,請參考
http://www.dotblogs.com.tw/yc421206/archive/2014/01/20/141712.aspx
http://www.dotblogs.com.tw/yc421206/archive/2014/01/21/141824.aspx
開啟 NuGet Package Manager Console
輸入 Enable-Migrations,VS 它會自動產生,Migrations資料夾,裡面存放著
1."時間戳記_InitialCreate".cs
2.Configuration.cs
@InitialCreate.cs
從資料庫裡面拿出來的欄位
{ using System; using System.Data.Entity.Migrations; public partial class InitialCreate : DbMigration { public override void Up() { CreateTable( "dbo.Customers", c => new { Id = c.Int(nullable: false, identity: true), Name = c.String(), }) .PrimaryKey(t => t.Id); CreateTable( "dbo.Products", c => new { ISBN = c.String(nullable: false, maxLength: 128), AuthiorName = c.String(), BookName = c.String(), Category = c.String(), Price = c.Decimal(nullable: false, precision: 18, scale: 2), CustomerId = c.Int(nullable: false), }) .PrimaryKey(t => t.ISBN) .ForeignKey("dbo.Customers", t => t.CustomerId, cascadeDelete: true) .Index(t => t.CustomerId); } public override void Down() { DropForeignKey("dbo.Products", "CustomerId", "dbo.Customers"); DropIndex("dbo.Products", new[] { "CustomerId" }); DropTable("dbo.Products"); DropTable("dbo.Customers"); } } }
@Configuration.cs
ContextKey 是很重要的屬性,所需規則是『命名空間+DbContextName』
Add-Migration [有意義的名稱],下圖範例為 Add-Migration AddOrderName,VS 又幫我們產生了 "時間戳記_AddOrderName".cs,很明顯的這代表 Schema 的版本歷程
以下程式碼,表示我需要新增一個欄位叫 OrderName(調用AddColumn),還原狀態的時候幫我刪除掉 OrderName(DropColumn)
@AddOrderName.cs
{ public override void Up() { AddColumn("dbo.Customers", "OrderName", c => c.String()); } public override void Down() { DropColumn("dbo.Customers", "OrderName"); } }
呼叫Update-Database,可以發現它套用的 Migration 版本是最後一個時間戳記
再次按下F5則能順利執行,錯誤訊息不見了,資料庫的 Schema 也順利新增了
文章出自:http://www.dotblogs.com.tw/yc421206/archive/2014/02/20/144093.aspx
參考資料:http://msdn.microsoft.com/zh-tw/data/jj591621.aspx
範例下載:https://dotblogsfile.blob.core.windows.net/user/yc421206/1402/2014221175414187.zip
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET