Migrations avec plusieurs fournisseurs

Les EF Core Tools ne mettent automatiquement en place les structures des migrations que pour le fournisseur actif. Toutefois, vous souhaitez peut-être utiliser plusieurs fournisseurs (par exemple Microsoft SQL Server et SQLite) avec votre DbContext. Gérez cela en conservant plusieurs ensembles de migrations (un pour chaque fournisseur) et en ajoutant une migration à chaque modification de modèle.

Utilisation de plusieurs types de contextes

Une façon de créer plusieurs jeux de migration consiste à utiliser un type DbContext par fournisseur.

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

Spécifiez le type de contexte lors de l’ajout de nouvelles migrations.

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

Conseil

Pas besoin de spécifier le répertoire de sortie pour les migrations suivantes, car ils sont créés en tant que frères et sœurs vers le dernier.

Utilisation d’un type de contexte

Un type DbContext peut aussi être utilisé. Cela nécessite actuellement le déplacement des migrations dans un assembly distinct. Consultez Utilisation d’un projet de migration distinct pour obtenir des instructions sur la configuration de vos projets.

Conseil

Vous pouvez afficher cet exemple sur GitHub.

Vous pouvez transmettre des arguments à l’application au travers des outils. Cela permet un flux de travail plus rationalisé et évite d’avoir à apporter des modifications manuelles au projet lors de l’exécution des outils.

Voici un modèle qui fonctionne bien lors de l’utilisation d’un hôte générique.

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}")
                    });
            });

Étant donné que le générateur d’hôtes par défaut lit la configuration à partir des arguments de ligne de commande, vous pouvez spécifier le fournisseur lors de l’exécution des outils.

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

Conseil

Le jeton -- dirige dotnet ef pour traiter tout ce qui suit comme argument, sans essayer de les analyser en tant qu’options. Tous les arguments supplémentaires, non utilisés par dotnet ef, sont transférés à l’application.