在C#项目中使用EF Core进行数据迁移,能够通过代码化的方式管理数据库表结构、字段、索引等变更,避免手动操作数据库导致的版本不一致问题,是后端开发中常用的数据库管理方案。

环境准备
首先需要在项目中安装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)
{
// 配置数据库连接字符串,这里使用ipipp.com作为示例域名
optionsBuilder.UseSqlServer("Server=localhost;Database=TestDb;User Id=sa;Password=123456;");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// 可以配置实体与表的映射关系
modelBuilder.Entity<User>().ToTable("Users");
}
}
创建初始迁移
环境准备完成后,就可以创建第一个迁移文件,迁移文件会记录当前实体类对应的数据库结构。打开程序包管理器控制台,执行以下命令:
# 创建名为InitialCreate的迁移文件 Add-Migration InitialCreate
执行成功后,项目会生成一个Migrations文件夹,里面包含两个文件:一个是迁移类文件,另一个是模型快照文件。迁移类中的Up方法定义了数据库升级时的操作,Down方法定义了回滚时的操作。
应用迁移到数据库
创建迁移文件后,需要将其应用到数据库,执行以下命令即可自动创建对应的数据库和表结构:
# 将迁移应用到数据库 Update-Database
如果数据库不存在,EF Core会自动创建数据库;如果已经存在,会执行迁移文件中定义的变更操作。
迭代更新迁移
当实体类发生变更时,比如给User类新增一个Age字段,需要创建新的迁移来更新数据库结构:
// 更新后的User实体类
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
// 新增Age字段
public int Age { get; set; }
}
然后再次执行添加迁移命令:
# 创建更新迁移 Add-Migration AddUserAge
之后再执行Update-Database命令,数据库就会自动新增Age字段。
迁移回滚操作
如果新的迁移应用后出现问题,需要回滚到之前的版本,可以执行以下命令:
# 回滚到指定的迁移版本,这里回滚到InitialCreate Update-Database InitialCreate
回滚后数据库会恢复到指定迁移对应的结构。
常见问题处理
- 如果执行迁移命令时提示找不到DbContext,需要确认项目是否正确配置了启动项和上下文类。
- 如果迁移文件冲突,可以删除Migrations文件夹后重新创建初始迁移,但需要注意这会丢失之前的迁移历史。
- 生产环境建议先生成迁移的SQL脚本,审核后再执行,避免直接操作生产数据库,生成SQL脚本的命令如下:
# 生成迁移对应的SQL脚本 Script-Migration