Migrations avec plusieurs fournisseursMigrations with Multiple Providers

Le [outils EF Core] 1 structurer uniquement les migrations pour le fournisseur active.The EF Core Tools only scaffold migrations for the active provider. Toutefois, vous pouvez être amené à utiliser plusieurs fournisseurs (par exemple Microsoft SQL Server et SQLite) avec votre DbContext.Sometimes, however, you may want to use more than one provider (for example Microsoft SQL Server and SQLite) with your DbContext. Il existe deux façons de gérer cela avec des Migrations.There are two ways to handle this with Migrations. Vous pouvez conserver les deux ensembles de migrations--un pour chaque fournisseur--ou la fusion dans une seule valeur qui peut travailler sur les deux.You can maintain two sets of migrations--one for each provider--or merge them into a single set that can work on both.

Deux ensembles de migrationTwo migration sets

Dans la première approche, vous générez deux migrations pour chaque modification de modèle.In the first approach, you generate two migrations for each model change.

Pour effectuer cela consiste à placer chaque ensemble de la migration [dans un assembly distinct] 2 et basculer manuellement le fournisseur actif (et l’assembly de migrations) entre l’ajout les deux migrations.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.

Une autre approche qui facilite l’utilisation avec les outils consiste à créer un nouveau type qui dérive de votre DbContext et remplace le fournisseur actif.Another approach that makes working with the tools easier is to create a new type that derives from your DbContext and overrides the active provider. Ce type est utilisé lors de la conception du temps lors de l’ajout ou appliquer des migrations.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");
}

Note

Étant donné que chaque ensemble de migration utilise ses propres types DbContext, cette approche ne nécessite pas à l’aide d’un assembly de migrations distinctes.Since each migration set uses its own DbContext types, this approach doesn't require using a separate migrations assembly.

Lorsque vous ajoutez la nouvelle migration, spécifier les types de contexte.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

Conseil

Vous n’avez pas besoin de spécifier le répertoire de sortie pour les migrations suivantes dans la mesure où ils sont créés en tant que frères au dernier signet.You don't need to specify the output directory for subsequent migrations since they are created as siblings to the last one.

Migration d’un jeuOne migration set

Si vous n’aimez pas avoir deux ensembles de migrations, vous pouvez manuellement les combiner en un seul ensemble peut être appliqué pour les deux fournisseurs.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.

Annotations peuvent coexister dans la mesure où un fournisseur ignore toutes les annotations qui ne comprend pas.Annotations can coexist since a provider ignores any annotations that it doesn't understand. Par exemple, une colonne de clé primaire qui fonctionne avec Microsoft SQL Server et SQLite peut ressembler à ceci.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),

Si des opérations peuvent être appliquées uniquement sur un seul fournisseur (ou elles différemment entre les fournisseurs), utilisez le ActiveProvider propriété pour indiquer à quel fournisseur est actif.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");
}