使用 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
手动添加数据库初始化记录。