Migrationen mit mehreren AnbieternMigrations with Multiple Providers

Mit den EF Core Tools werden nur die Migrationen für den aktiven Anbieter Gerüstbau.The EF Core Tools only scaffold migrations for the active provider. Manchmal möchten Sie jedoch möglicherweise mehr als einen Anbieter (z. b. Microsoft SQL Server und SQLite) mit dbcontext verwenden.Sometimes, however, you may want to use more than one provider (for example Microsoft SQL Server and SQLite) with your DbContext. Behandeln Sie dieses Vorgehen, indem Sie mehrere Sätze von Migrationen (eines für jeden Anbieter) beibehalten und eine Migration zu jeder Modell Änderung hinzufügen.Handle this by maintaining multiple sets of migrations--one for each provider--and adding a migration to each for every model change.

Verwenden mehrerer Kontext TypenUsing multiple context types

Eine Möglichkeit zum Erstellen mehrerer Migrations Sätze besteht darin, einen dbcontext-Typ pro Anbieter zu verwenden.One way to create multiple migration sets is to use one DbContext type per provider.

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

Geben Sie beim Hinzufügen neuer Migrationen den Kontexttyp anSpecify the context type when adding new migrations.

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 diese als gleich geordnete Elemente der letzten erstellt werden.You don't need to specify the output directory for subsequent migrations since they are created as siblings to the last one.

Verwenden eines Kontext TypsUsing one context type

Es ist auch möglich, einen dbcontext-Typ zu verwenden.It's also possible to use one DbContext type. Dies erfordert derzeit, dass die Migrationen in eine separate Assembly verschoben werden.This currently requires moving the migrations into a separate assembly. Anweisungen zum Einrichten von Projekten finden Sie unter Verwenden eines separaten Migrations Projekts .Please refer to Using a Separate Migrations Project for instructions on setting up your projects.

Tipp

Das in diesem Artikel verwendete Beispiel finden Sie auf GitHub.You can view this article's sample on GitHub.

Ab EF Core 5,0 können Sie Argumente aus den-Tools an die APP übergeben.Starting in EF Core 5.0, you can pass arguments into the app from the tools. Dies kann einen optimierten Workflow ermöglichen, der beim Ausführen der Tools keine manuellen Änderungen am Projekt vornehmen muss.This can enable a more streamlined workflow that avoids having to make manual changes to the project when running the tools.

Hier ist ein Muster, das bei der Verwendung eines generischen Hostsgut funktioniert.Here's one pattern that works well when using a Generic Host.

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 Standard Host-Generator die Konfiguration über Befehlszeilenargumente liest, können Sie den Anbieter angeben, wenn Sie die Tools ausführen.Since the default host builder reads configuration from command-line arguments, you can specify the provider when running the tools.

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

Tipp

Das -- Token leitet dotnet ef , um alle nachfolgenden Elemente als Argument zu behandeln, und versucht nicht, Sie als Optionen zu analysieren.The -- token directs dotnet ef to treat everything that follows as an argument and not try to parse them as options. Alle zusätzlichen Argumente, die nicht von verwendet dotnet ef werden, werden an die APP weitergeleitet.Any extra arguments not used by dotnet ef are forwarded to the app.

Hinweis

Die Möglichkeit, zusätzliche Argumente für die APP anzugeben, wurde in EF Core 5,0 hinzugefügt.The ability to specify additional arguments for the app was added in EF Core 5.0. Wenn Sie eine ältere Version verwenden, geben Sie stattdessen Konfigurationswerte mit Umgebungsvariablen an.If you're using an older version, specify configuration values with environment variables instead.