Chris Pickford
Chris Pickford

Reputation: 9001

EF Core Migrations with multiple DbContexts on single database

I have an issue attempting to use Migrations in a ASP.NET Core solution using EF Core where there are multiple DbContext that share the same SQL database.

In my application startup method I'm getting a reference to each context and calling the context.Database.Migrate() method. However as both of these contexts are pointing to the same underlying database I'm getting the error:

There is already an object named '__EFMigrationsHistory' in the database.

Here's a 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");
  });
}

Note that each DbContext exists in a separate assembly in which the Migrations are configured.

I am able to manually execute the respective migrations with the Update-Database CLI tool but it doesn't seem to work as part of my app startup code.

Is there a way to execute migrations on both contexts at runtime and bypass the __EFMigrationsHistory table creation if already exists?

Upvotes: 13

Views: 17412

Answers (1)

Asakuraa Ranger
Asakuraa Ranger

Reputation: 617

I think your problem is just two Context try to use same migration history table

try specific your migration history table for each

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

it should be fix

Custom Migrations History Table

Upvotes: 21

Related Questions