EF Core的数据迁移功能能够将实体模型的变化同步到数据库结构中,同时保留历史变更记录,是C#后端开发中管理数据库结构的重要工具。下面将从基础环境配置开始,逐步介绍完整的使用流程和注意事项。

一、基础环境准备
使用EF Core数据迁移前,需要先完成基础依赖的安装和上下文配置。首先需要在项目中安装对应的NuGet包,以SQL Server数据库为例,需要安装Microsoft.EntityFrameworkCore.SqlServer和Microsoft.EntityFrameworkCore.Tools两个核心包,前者用于数据库驱动,后者提供迁移相关的命令行工具。
接下来需要定义实体类和数据库上下文,示例代码如下:
// 示例实体类
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
}
// 数据库上下文类
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// 配置数据库连接字符串,这里使用本地SQL Server实例
optionsBuilder.UseSqlServer("Server=localhost;Database=TestDb;Trusted_Connection=True;");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// 可以在这里配置实体的映射规则
modelBuilder.Entity<User>().HasKey(u => u.Id);
}
}
二、EF Core数据迁移的核心操作步骤
1. 创建迁移文件
完成上下文配置后,就可以使用命令行工具创建迁移文件。在项目根目录打开命令行,执行以下命令:
# 添加迁移,InitialCreate是迁移的名称,可自定义 dotnet ef migrations add InitialCreate
执行成功后,项目会生成一个Migrations文件夹,里面包含本次迁移的代码文件,以及迁移快照文件。迁移代码中会记录本次模型变更需要执行的数据库操作,比如创建表、添加列等。
2. 应用迁移到数据库
创建好迁移文件后,需要将迁移应用到数据库,让数据库结构同步到最新状态,执行以下命令:
# 将未应用的迁移同步到数据库 dotnet ef database update
如果是第一次执行该命令,EF Core会自动创建对应的数据库和表结构。如果后续有新的模型变更,重复创建迁移、应用迁移的步骤即可。
3. 回滚迁移
如果需要回退到之前的数据库结构,可以指定迁移名称进行回滚,示例命令如下:
# 回滚到指定名称的迁移,这里回滚到初始迁移之前的状态 dotnet ef database update 0
也可以指定具体的迁移名称,回滚到该迁移对应的数据库状态。
三、EF Core数据迁移的注意事项
- 迁移名称要见名知意,不要使用无意义的名称,方便后续追溯变更历史。
- 生成迁移文件后,一定要检查迁移代码的逻辑是否正确,尤其是涉及删除列、修改列类型等不可逆操作时,避免造成数据丢失。
- 生产环境执行迁移前,一定要先在测试环境验证迁移的正确性,确认不会影响现有业务数据。
- 不要在迁移代码中编写业务逻辑,迁移代码只负责数据库结构的变更操作。
- 如果使用代码优先模式,不要手动修改数据库结构后再创建迁移,否则会导致迁移文件与数据库实际状态不一致,引发冲突。
- 团队协作时,迁移文件要提交到版本控制系统,所有成员使用同一套迁移历史,避免各自生成迁移导致冲突。
四、常见问题处理
如果遇到迁移冲突,可以先执行dotnet ef migrations remove命令删除最后一次创建的迁移,然后重新调整模型后再生成迁移。如果数据库已经被手动修改过,可以删除Migrations文件夹和数据库,重新从初始迁移开始生成,确保模型和数据库状态一致。
EF Core还支持在代码中手动触发迁移,适合需要在应用启动时自动同步数据库结构的场景,示例代码如下:
// 在应用启动时自动应用未同步的迁移
using (var db = new AppDbContext())
{
db.Database.Migrate();
}
这种方式会自动检测未应用的迁移并执行,不需要手动输入命令行,但要注意生产环境使用该方式前一定要做好数据备份。