Migrationen mit mehreren Anbietern

Die EF Core Tools erstellen nur ein Gerüst für Migrationen für den aktiven Anbieter. Manchmal möchten Sie jedoch möglicherweise mehrere Anbieter (z. B. Microsoft SQL Server und SQLite) mit Ihrem DbContext verwenden. Behandeln Sie dies, indem Sie mehrere Gruppen von Migrationen verwalten – eine für jeden Anbieter – und für jede Modelländerung eine Migration hinzufügen.

Verwenden mehrerer Kontexttypen

Eine Möglichkeit zum Erstellen mehrerer Migrationsgruppen besteht darin, einen DbContext-Typ pro Anbieter zu verwenden.

class SqliteBlogContext : BlogContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlite("Data Source=my.db");
}

Geben Sie den Kontexttyp beim Hinzufügen neuer Migrationen an.

dotnet ef migrations add InitialCreate --context BlogContext --output-dir Migrations/SqlServerMigrations
dotnet ef migrations add InitialCreate --context SqliteBlogContext --output-dir Migrations/SqliteMigrations

Tipp

Sie müssen das Ausgabeverzeichnis für nachfolgende Migrationen nicht angeben, da sie als gleichgeordnete Objekte der letzten Migration erstellt werden.

Verwenden eines Kontexttyps

Es ist auch möglich, einen DbContext-Typ zu verwenden. Dies erfordert derzeit das Verschieben der Migrationen in eine separate Assembly. Anweisungen zum Einrichten Ihrer Projekte finden Sie unter Verwendung eines separaten Migrationsprojekts.

Tipp

Das in diesem Artikel verwendete Beispiel finden Sie auf GitHub.

Sie können Argumente aus den Tools an die App übergeben. Dadurch kann ein optimierter Workflow ermöglicht werden, so dass keine manuellen Änderungen am Projekt vorgenommen werden müssen, wenn die Tools ausgeführt werden.

Hier ist ein Muster, das bei der Verwendung eines generischen Hosts gut funktioniert.

public static IHostBuilder CreateHostBuilder(string[] args)
    => Host.CreateDefaultBuilder(args)
        .ConfigureServices(
            (hostContext, services) =>
            {
                services.AddHostedService<Worker>();

                // Set the active provider via configuration
                var configuration = hostContext.Configuration;
                var provider = configuration.GetValue("Provider", "SqlServer");

                services.AddDbContext<BlogContext>(
                    options => _ = provider switch
                    {
                        "Sqlite" => options.UseSqlite(
                            configuration.GetConnectionString("SqliteConnection"),
                            x => x.MigrationsAssembly("SqliteMigrations")),

                        "SqlServer" => options.UseSqlServer(
                            configuration.GetConnectionString("SqlServerConnection"),
                            x => x.MigrationsAssembly("SqlServerMigrations")),

                        _ => throw new Exception($"Unsupported provider: {provider}")
                    });
            });

Da der Standardhostgenerator die Konfiguration von Befehlszeilenargumenten liest, können Sie den Anbieter angeben, wenn Sie die Tools ausführen.

dotnet ef migrations add MyMigration --project ../SqlServerMigrations -- --provider SqlServer
dotnet ef migrations add MyMigration --project ../SqliteMigrations -- --provider Sqlite

Tipp

Das ---Token weist dotnet ef an, alles nachfolgende als Argument zu behandeln und nicht zu versuchen, es als Optionen zu parsen. Alle zusätzlichen Argumente, die von dotnet ef nicht verwendet werden, werden an die App weitergeleitet.