Migrazioni con più provider

Ef Core Tools esegue solo lo scaffolding delle migrazioni per il provider attivo. In alcuni casi, tuttavia, è consigliabile usare più provider (ad esempio Microsoft SQL Server e SQLite) con DbContext. Gestire questa operazione mantenendo più set di migrazioni, uno per ogni provider, e aggiungendo una migrazione a ogni modifica del modello.

Uso di più tipi di contesto

Un modo per creare più set di migrazione consiste nell'usare un tipo DbContext per provider.

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

Specificare il tipo di contesto quando si aggiungono nuove migrazioni.

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

Suggerimento

Non è necessario specificare la directory di output per le migrazioni successive perché vengono create come elementi di pari livello all'ultimo.

Uso di un tipo di contesto

È anche possibile usare un tipo DbContext. Questo richiede attualmente lo spostamento delle migrazioni in un assembly separato. Per istruzioni sulla configurazione dei progetti, vedere Uso di un progetto di migrazioni separate.

Suggerimento

È possibile visualizzare l'esempio di questo articolo in GitHub.

È possibile passare argomenti all'app dagli strumenti. In questo modo è possibile abilitare un flusso di lavoro più semplificato che evita di dover apportare modifiche manuali al progetto durante l'esecuzione degli strumenti.

Ecco un modello che funziona bene quando si usa un host generico.

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

Poiché il generatore host predefinito legge la configurazione dagli argomenti della riga di comando, è possibile specificare il provider durante l'esecuzione degli strumenti.

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

Suggerimento

Il -- token indirizza dotnet ef a trattare tutto ciò che segue come argomento e non cerca di analizzarli come opzioni. Eventuali argomenti aggiuntivi non usati da dotnet ef vengono inoltrati all'app.