参考:Code First Migration

使用 EF Code First 时,对实体类的更改不会自动映射到数据库。此时可以通过 DB Migration 更新数据库。

具体操作

通过 FluentAPI 修改 Student 实体类的配置,将其 Name 属性设置为不能为空,且最大长度 50:

  1. public class SutdentConfig : EntityTypeConfiguration<StudentEntity>
  2. {
  3. public SutdentConfig()
  4. {
  5. ToTable("T_Student");
  6. Property(s => s.Name).IsRequired().HasMaxLength(50);
  7. }
  8. }

打开 程序包管理器控制台
EF Code First DB Migration - 图1

运行以下命令开启 DB Migration:

  1. Enable-Migrations

开启 Migration 后,EF 会在项目根目录自动创建 Migrations 文件夹,用于跟踪记录迁移历史。
EF Code First DB Migration - 图2

新增一条名为 UpdateStudent 的 Migration 记录:

  1. Add-Migration UpdateStudent

EF 将在 Migrations 文件夹下创建一个包含时间戳的迁移文件。
EF Code First DB Migration - 图3

文件内部记录了对数据库更改。

  1. namespace EfTest.Migrations
  2. {
  3. using System;
  4. using System.Data.Entity.Migrations;
  5. public partial class UpdateStudent : DbMigration
  6. {
  7. public override void Up()
  8. {
  9. AlterColumn("dbo.T_Student", "Name", c => c.String(nullable: false, maxLength: 50));
  10. }
  11. public override void Down()
  12. {
  13. AlterColumn("dbo.T_Student", "Name", c => c.String());
  14. }
  15. }
  16. }

最后运行下面的命令让更新数据库:

  1. Update-Database

至此一次 DB Migration 操作就完成了。以后再有更改,只需重复修改实体类或配置、Add Migration XXX 和 Update-Database 的步骤。

FAQ

No initial create with Entity Framework migrations

Q:当你数据库和相关表已经创建过后,运行 Enable Migrations 时,EF 没有自动创建 InitialCreate 记录。

A:通过 Add-Migration InitialCreate -IgnoreChanges 手动添加数据库初始化记录。