Code-First數據遷移 數據庫
首先要經過NuGet將EF升級至最新版本。架構
新建MVC 4項目MvcMigrationDemoide
添加數據模型 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 }
添加控制器 PersonControllerui
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 spa
登錄(localdb)\v11.0,數據庫以下圖:3d
出現新建表[dbo].[Departments]和[dbo].[People],以及系統表[dbo].[__MigrationHistory]。調試
其中[dbo].[__MigrationHistory]用來追蹤每次數據模型異動信息,以下圖code
MigrationId記錄版本,Model記錄此次建立時的數據模型,ProductVersion表明當前EF版本。blog
啓動數據遷移
打開程序包管理器控制檯,輸入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保哥做品