[C#.NET][Entity Framework] 初探 Code First Migration

[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).

image

 

 

這時就必須要使用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

image

 

 

 

輸入 Enable-Migrations,VS 它會自動產生,Migrations資料夾,裡面存放著

1."時間戳記_InitialCreate".cs

2.Configuration.cs

image

 

@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』
image
 

 

Add-Migration [有意義的名稱],下圖範例為 Add-Migration AddOrderName,VS 又幫我們產生了 "時間戳記_AddOrderName".cs,很明顯的這代表 Schema 的版本歷程

image

 

 

 

 

 

 

 

以下程式碼,表示我需要新增一個欄位叫 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 版本是最後一個時間戳記

image

 

 

再次按下F5則能順利執行,錯誤訊息不見了,資料庫的 Schema 也順利新增了

SNAGHTMLfb37c67

 


文章出自: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

Image result for microsoft+mvp+logo