在单个数据库上具有多个DbContext的EF核心迁移

Chr*_*ord 4 c# entity-framework ef-migrations entity-framework-core asp.net-core

尝试在使用EF Core的ASP.NET Core解决方案中使用迁移时遇到问题,其中有多个DbContext共享同一SQL数据库。

在我的应用程序启动方法中,我获得对每个上下文的引用并调用该context.Database.Migrate()方法。但是,由于这两个上下文都指向同一个基础数据库,因此出现错误:

数据库中已经有一个名为“ __EFMigrationsHistory”的对象。

这是MCVE:

class DbContextA : DbContext {}
class DbContextB : DbContext {}

static void Main(string[] args)
{
  var contextA = GetContextFromDIContainer<DbContextA>();
  var contextB = GetContextFromDIContainer<DbContextB>();

  contextA.Database.Migrate();
  contextB.Database.Migrate();
}

void ConfigureServices(IServiceCollection services)
{
  services.AddDbContext<DbContextA>(opt =>
  {
    opt.UseSqlServer("connectionstring");
  });

  services.AddDbContext<DbContextB>(opt =>
  {
    opt.UseSqlServer("connectionstring");
  });
}
Run Code Online (Sandbox Code Playgroud)

请注意,每个DbContext组件都存在于配置了迁移的单独程序集中。

我可以使用Update-DatabaseCLI工具手动执行相应的迁移,但它似乎不能作为我的应用启动代码的一部分。

有没有办法在运行时在两个上下文上执行迁移并绕过__EFMigrationsHistory表创建(如果已经存在)?

Asa*_*ger 8

我认为您的问题只是两个Context尝试使用相同的迁移历史记录表

尝试为每个特定的迁移历史记录表

protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer(
    connectionString,
    x => x.MigrationsHistoryTable("__MyMigrationsHistoryForDBContextA", "mySchema"));
Run Code Online (Sandbox Code Playgroud)

它应该解决

自定义迁移历史记录表

  • 我有来自不同程序集的多个 dbcontext 在我的项目中运行良好,并且它们都使用相同的迁移历史表,必须这样做似乎很奇怪。 (2认同)