Migrationen mit mehreren AnbieternMigrations with Multiple Providers

Die EF Core Tools nur das Gerüst für Migrationen für den aktiven Anbieter erstellen.The EF Core Tools only scaffold migrations for the active provider. In einigen Fällen sollten Sie jedoch für die Verwendung von mehr als einen Anbieter (z. B. Microsoft SQL Server und SQLite) mit Ihrem DbContext.Sometimes, however, you may want to use more than one provider (for example Microsoft SQL Server and SQLite) with your DbContext. Es gibt zwei Möglichkeiten, dies mit Migrationen behandeln.There are two ways to handle this with Migrations. Verwalten von zwei Sätze können Sie Migrationen – eine für jeden Anbieter-- oder Merge diese in einem einzelnen festlegen, die auf beiden arbeiten kann.You can maintain two sets of migrations--one for each provider--or merge them into a single set that can work on both.

Zwei Sätze von migrationTwo migration sets

In der ersten Methode generieren Sie zwei Migrationen für jedes Modell ändern.In the first approach, you generate two migrations for each model change.

Eine Möglichkeit hierfür dies darin, jeden Satz Migration in einer separaten Assembly und manuell die aktiven Anbieter (und Migrationen Assembly) zwischen dem Hinzufügen von zwei Migrationen wechseln.One way to do this is to put each migration set in a separate assembly and manually switch the active provider (and migrations assembly) between adding the two migrations.

Ein anderer Ansatz vereinfacht die Verwendung mit den Tools einfacher ist, zum Erstellen eines neuen Typs von Ihrem ' DbContext ' abgeleitet und überschreibt den aktiven Anbieter.Another approach that makes working with the tools easier is to create a new type derives from your DbContext and overrides the active provider. Dieser Typ dient zur Entwurfszeit Zeit beim Hinzufügen oder Migrationen anwenden.This type is used at design time when adding or applying migrations.

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

Hinweis

Da jede Migration eigene DbContext-Typen verwendet werden, erforderlich nicht bei diesem Ansatz unter Verwendung einer separaten Migrationen-Assembly.Since each migration set uses its own DbContext types, this approach doesn't require using a separate migrations assembly.

Wenn neue Migration hinzufügen möchten, geben Sie die Kontexttypen.When adding new migration, specify the context types.

Add-Migration InitialCreate -Context MyDbContext -OutputDir Migrations\SqlServerMigrations
Add-Migration InitialCreate -Context MySqliteDbContext -OutputDir Migrations\SqliteMigrations
dotnet ef migrations add InitialCreate --context MyDbContext --output-dir Migrations/SqlServerMigrations
dotnet ef migrations add InitialCreate --context MySqliteDbContext --output-dir Migrations/SqliteMigrations

Tipp

Sie müssen das Ausgabeverzeichnis für nachfolgende Migrationen angeben, da sie als gleichgeordnete Elemente, das letzte Lesezeichen erstellt werden.You don't need to specify the output directory for subsequent migrations since they are created as siblings to the last one.

Eine Migration festlegenOne migration set

Wenn Sie nicht, müssen zwei Sätze von Migrationen möchten, können Sie diese manuell in einem Einzelsatz kombinieren, die auf beide Anbieter angewendet werden können.If you don't like having two sets of migrations, you can manually combine them into a single set that can be applied to both providers.

Anmerkungen können zusammen verwendet werden, da ein Anbieter alle Anmerkungen ignoriert, die es nicht verstanden hat.Annotations can coexist since a provider ignores any annotations that it doesn't understand. Beispielsweise kann eine Primärschlüsselspalte, die mit Microsoft SQL Server und SQLite funktioniert wie folgt aussehen.For example, a primary key column that works with both Microsoft SQL Server and SQLite might look like this.

Id = table.Column<int>(nullable: false)
    .Annotation("SqlServer:ValueGenerationStrategy",
        SqlServerValueGenerationStrategy.IdentityColumn)
    .Annotation("Sqlite:Autoincrement", true),

Wenn Vorgänge nur auf einen Anbieter angewendet werden können (oder sie unterschiedlich zwischen Anbietern sind), verwenden Sie die ActiveProvider Eigenschaft mitteilen, welche Anbieter aktiv ist.If operations can only be applied on one provider (or they're differently between providers), use the ActiveProvider property to tell which provider is active.

if (migrationBuilder.ActiveProvider == "Microsoft.EntityFrameworkCore.SqlServer")
{
    migrationBuilder.CreateSequence(
        name: "EntityFrameworkHiLoSequence");
}