使用 EF Code First 时,对实体类的更改不会自动映射到数据库。此时可以通过 DB Migration 更新数据库。
具体操作
通过 FluentAPI 修改 Student 实体类的配置,将其 Name 属性设置为不能为空,且最大长度 50:
public class SutdentConfig : EntityTypeConfiguration<StudentEntity>{public SutdentConfig(){ToTable("T_Student");Property(s => s.Name).IsRequired().HasMaxLength(50);}}
打开 程序包管理器控制台
运行以下命令开启 DB Migration:
Enable-Migrations
开启 Migration 后,EF 会在项目根目录自动创建 Migrations 文件夹,用于跟踪记录迁移历史。
新增一条名为 UpdateStudent 的 Migration 记录:
Add-Migration UpdateStudent
EF 将在 Migrations 文件夹下创建一个包含时间戳的迁移文件。
文件内部记录了对数据库更改。
namespace EfTest.Migrations{using System;using System.Data.Entity.Migrations;public partial class UpdateStudent : DbMigration{public override void Up(){AlterColumn("dbo.T_Student", "Name", c => c.String(nullable: false, maxLength: 50));}public override void Down(){AlterColumn("dbo.T_Student", "Name", c => c.String());}}}
最后运行下面的命令让更新数据库:
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 手动添加数据库初始化记录。
