使用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則需要手動遷移
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、自動遷移
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來完成,在每次更改實體或映射配置后,我們運行下面這個命令來生成一個遷移文件:
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等)
這個參數可以指定目標遷移版本,對於需要退回到指定版本的情況很有用(回滾)