Code-First數據遷移
首先要通過NuGet將EF升級至最新版本。
新建MVC 4項目MvcMigrationDemo
添加數據模型 Person 和 Department,定義如下:

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.ComponentModel.DataAnnotations; 6 using System.ComponentModel.DataAnnotations.Schema; 7 8 namespace MvcMigrationDemo.Models 9 { 10 public class Person 11 { 12 [Key] 13 public int PersonID { get; set; } 14 15 [Required] 16 [MaxLength(20)] 17 public string PersonName { get; set; } 18 19 public virtual Department Departmant { get; set; } 20 21 } 22 }

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.ComponentModel.DataAnnotations; 6 using System.ComponentModel.DataAnnotations.Schema; 7 8 namespace MvcMigrationDemo.Models 9 { 10 public class Department 11 { 12 [Key] 13 public int DeptID { get; set; } 14 15 [Required] 16 [MaxLength(200)] 17 public string DeptName { get; set; } 18 19 public ICollection<Person> Persons { get; set; } 20 } 21 }
添加控制器 PersonController

using System.Data.Entity; namespace MvcMigrationDemo.Models { public class MvcMigrationDemoContext : DbContext { // 您可以向此文件中添加自定義代碼。更改不會被覆蓋。 // // 如果您希望只要更改模型架構,Entity Framework // 就會自動刪除並重新生成數據庫,則將以下 // 代碼添加到 Global.asax 文件中的 Application_Start 方法。 // 注意: 這將在每次更改模型時銷毀並重新創建數據庫。 // // System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<MvcMigrationDemo.Models.MvcMigrationDemoContext>()); public MvcMigrationDemoContext() : base("name=MvcMigrationDemoContext") { } public DbSet<Person> People { get; set; } public DbSet<Department> Departments { get; set; } } }
調試,網址輸入http://localhost:7139/Person
登陸(localdb)\v11.0,數據庫如下圖:
出現新建表[dbo].[Departments]和[dbo].[People],以及系統表[dbo].[__MigrationHistory]。
其中[dbo].[__MigrationHistory]用來追蹤每次數據模型異動信息,如下圖
MigrationId記錄版本,Model記錄這次創建時的數據模型,ProductVersion代表當前EF版本。
啟動數據遷移
打開程序包管理器控制台,輸入Enable-Migrations指令,以MvcMigrationDemoContext為例,輸入如下:
Enable-Migrations -ContextTypeName MvcMigrationDemo.Models.MvcMigrationDemoContext
運行結果如下:
查看解決方案資源管理器,如圖
VS 會創建一個Migrations目錄,包含兩個文檔201507070650021_InitialCreate和Configuration。
會發現201507070650021_InitialCreate剛好和[dbo].[__MigrationHistory].MigrationId一致,文檔記錄了創建本次數據模型的完整描述。
Configuration定義了數據庫遷移該有的行為。
運行數據庫遷移
修改Department數據模型如下:添加About字段

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.ComponentModel.DataAnnotations; 6 using System.ComponentModel.DataAnnotations.Schema; 7 8 namespace MvcMigrationDemo.Models 9 { 10 public class Department 11 { 12 [Key] 13 public int DeptID { get; set; } 14 15 [Required] 16 [MaxLength(200)] 17 public string DeptName { get; set; } 18 19 [MaxLength(4000)] 20 public string About { get; set; } 21 22 public ICollection<Person> Persons { get; set; } 23 } 24 }
在PM中,輸入Add-Migration指令,必須帶上一個版本名稱,本次操作如下:
查看項目Migration目錄,會發現新增文檔:201507070718108_AddAbout
此時還沒有對數據庫做任何遷移動作,可查看數據表Department,無任何修改如圖
手動添加測試數據如下圖
進行遷移動作 在PM中輸入Update-Database指令,本次操作如下:
更新數據庫成功后,查看數據庫。如下圖。
到此,數據遷移完成。
附1:可通過Update-Database指令自動生成數據庫遷移的T-SQL腳本,本次操作如下:Update-Database -SourceMigration 201507070650021_InitialCreate -TargetMigration 201507070718108_AddAbout -Script
附2:還原數據庫 本次操作如下:Update-Database -TargetMigration 201507070650021_InitialCreate
查看此時的數據庫,發現數據庫已還原:
附3:本文參考自Will保哥作品