Partager via


Migrations avec plusieurs fournisseurs

Les EF Core Tools génèrent uniquement des migrations pour le fournisseur actif. Toutefois, vous souhaiterez peut-être utiliser plusieurs fournisseurs (par exemple Microsoft SQL Server et SQLite) avec votre DbContext. Gérez-le 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 contexte

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 / Astuce

Vous n’avez pas besoin de spécifier le répertoire de sortie pour les migrations suivantes, car elles sont créées en tant qu'adjacents au dernier.

Utilisation d’un type de contexte

Il est également possible d’utiliser un type DbContext. Cela nécessite actuellement de déplacer les migrations dans un assemblage séparé. Reportez-vous à l’utilisation d’un projet de migrations distincts pour obtenir des instructions sur la configuration de vos projets.

Conseil / Astuce

Vous pouvez afficher l'exemple de cet article sur GitHub.

Vous pouvez transmettre des arguments à l’application à partir des outils. Cela peut permettre un flux de travail plus rationalisé qui é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 d’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 / Astuce

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.