EntityFramework之遷移操作(五)


使用Code First的話對於實體字段或者表映射修改都需要使用遷移操作,下面列出操作具體步驟

1、創建映射類和實體,本文主要是講解遷移步驟,其他代碼則沒有列出

1     public class ProductMap : EntityTypeConfiguration<Product>
2     {
3         public ProductMap()
4         {
5             ToTable("Product"); //指定表明
6             HasKey(p => p.Id);  //指定主鍵
7         }
8     }
1     public class Product
2     {
3         public int Id { get; set; }
4         public string Name { get; set; }
5         public string Description { get; set; }
6     }

2、假設現在Product類Name要設置為非空和最大長度為200

1     public class ProductMap : EntityTypeConfiguration<Product>
2     {
3         public ProductMap()
4         {
5             ToTable("Product"); //指定表明
6             HasKey(p => p.Id);  //指定主鍵
7             Property(p => p.Name).IsRequired().HasMaxLength(200);
8         }
9     }

 如果運行程序則會報錯

具體操作

啟用遷移需要在VS的程序包管理控制台輸入命令來完成,如果有多個項目,記得選擇對應項目

命令:Enable-Migrations

輸入命令后會創建一個文件夾Migrations其中有個Configuration文件

 1     internal sealed class Configuration : DbMigrationsConfiguration<MigrationOpt.Models.EntityContext>
 2     {
 3         public Configuration()
 4         {
 5             AutomaticMigrationsEnabled = false;
 6             ContextKey = "MigrationOpt.Models.EntityContext";
 7         }
 8 
 9         protected override void Seed(MigrationOpt.Models.EntityContext context)
10         {
11             
12         }
13     }

 AutomaticMigrationsEnabled設置為true表示自動遷移,為false則需要手動遷移

Seed方法是在遷移過程數據庫Schema成功應用以后執行的操作,可以利用這個方法添加一些初始化數據:

1 protected override void Seed(SchoolContext context)
2 {
3     context.Set<Student>().AddOrUpdate(
4       p => p.StudentName,
5       new Student { StudentName = "張三" },
6       new Student { StudentName = "李四" },
7       new Student { StudentName = "王五" }
8     );
9 }

 1、自動遷移

如果需要使用自動遷移的話,除了設置AutomaticMigrationsEnabled設置為true,還需要在DbContext構造函數中寫上這句

Database.SetInitializer(new MigrateDatabaseToLatestVersion<EntityContext, Configuration>("DBConnectionString"));

例如:

1         public EntityContext()
2             : base("name=DBConnectionString")
3         {
4             Database.SetInitializer(new MigrateDatabaseToLatestVersion<EntityContext, Configuration>("DBConnectionString"));
5         }

 2、手動遷移

如果不喜歡自動遷移,可以手工完成這個操作。手工遷移的好處后,可以隨時退回到某個指定的遷移版本。遷移文件也可以進行版本管理有利於團隊開發。

首先把Configuration構造函數中AutomaticMigrationsEnabled置為false,表示不使用自動遷移。

手動遷移的操作也是在程序包管理控制台使用PowerShell來完成,在每次更改實體或映射配置后,我們運行下面這個命令來生成一個遷移文件:

Add-Migration ChangeSet1

Add-Migration是固定的,空格后面的ChangeSet1是別名,可以自定義

輸入命令后會生成一個遷移文件,代碼:

 1     public partial class ChangeSet1 : DbMigration
 2     {
 3         public override void Up()
 4         {
 5             AlterColumn("dbo.Product", "Name", c => c.String(nullable: false, maxLength: 200));
 6         }
 7         
 8         public override void Down()
 9         {
10             AlterColumn("dbo.Product", "Name", c => c.String());
11         }
12     }

成功生成遷移文件后,運行 Update-Database 命令,EF就開始執行遷移操作,並把數據庫更新到最新的遷移文件對應的版本。

這條命令有幾個常用的參數,可以查看遷移在數據庫中執行的詳細操作(SQL等)

Update-Database -Verbose

這個參數可以指定目標遷移版本,對於需要退回到指定版本的情況很有用(回滾)

Update-Database -TargetMigration ChangeSet1


免責聲明!

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



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