使用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等)
这个参数可以指定目标迁移版本,对于需要退回到指定版本的情况很有用(回滚)