You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过C#代码调用EF(Core) Migrations重置数据库/数据表

问题解答

可以直接通过C#代码实现,无需调用外部CLI或包管理器控制台命令,EF Core 内置了IMigrator接口支持指定目标迁移版本完成回滚与升级操作。

实现方案

核心原理

你平常用的无参数Database.Migrate()只是EF Core封装的快捷方法,本质是调用底层IMigrator服务的MigrateAsync/Migrate方法,该方法支持传入目标迁移名称,传入"0"就等价于Update-Database -Migration:0的效果,会执行所有迁移的Down方法回滚到空库状态。

代码示例

场景1:使用依赖注入的场景(如ASP.NET Core项目)

从服务容器中获取IMigrator实例即可操作:

using Microsoft.EntityFrameworkCore.Migrations;
using YourNamespace.Data;

// 假设已拿到IServiceProvider服务提供者实例
using var scope = serviceProvider.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<YourDbContext>();
var migrator = scope.ServiceProvider.GetRequiredService<IMigrator>();

// 回滚到0版本(删除所有表)
await migrator.MigrateAsync(targetMigration: "0", cancellationToken: CancellationToken.None);
// 重新升级到最新版本
await migrator.MigrateAsync(cancellationToken: CancellationToken.None);

场景2:手动构造DbContext的场景

如果没有使用依赖注入,可以直接从DbContext实例中获取IMigrator服务:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Migrations;

var options = new DbContextOptionsBuilder<YourDbContext>()
    .UseSqlServer("你的数据库连接字符串")
    .Options;

using var dbContext = new YourDbContext(options);
var migrator = dbContext.GetService<IMigrator>();

// 也可以选择同步方法执行
migrator.Migrate("0");
migrator.Migrate();

注意事项

  • 该操作会清空数据库所有数据和表结构,执行前务必确认已做好数据备份,仅建议在测试环境、数据导入前的预处理等可控场景使用。
  • 需确保项目中所有迁移文件都存在,EF Core会根据本地迁移文件的定义执行对应Down/Up逻辑。
  • 如果你使用的是EF 6而非EF Core,实现逻辑类似,可调用DbMigrator类的Update方法指定目标迁移版本。

内容的提问来源于stack exchange,提问作者Martin Kirk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:48:01