EF Code-First數據遷移


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

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

調試,網址輸入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 }
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保哥作品 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM