EF Code-First數據遷移

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 }
Person
 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 }
Department

添加控制器 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; }
    }
}
MvcMigrationDemoContext

調試,網址輸入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 }
Department

在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保哥做品 

相關文章
相關標籤/搜索