Migrace s více poskytovateli

Nástroje EF Core Tools pouze vygenerují migrace pro aktivního poskytovatele. Někdy ale můžete chtít použít více než jednoho poskytovatele (například Microsoft SQL Server a SQLite) s vaším DbContext. Zachytávejte to tak, že pro každého zprostředkovatele zachováte několik sad migrací – jeden pro každého z nich – a pro každou změnu modelu přidáte migraci.

Použití více kontextových typů

Jedním ze způsobů, jak vytvořit více sad migrace, je použít jeden typ DbContext na zprostředkovatele.

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

Zadejte typ kontextu při přidávání nových migrací.

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

Tip

Pro následné migrace nemusíte zadávat výstupní adresář, protože se vytvářejí jako na stejné úrovni jako poslední.

Použití jednoho typu kontextu

Je také možné použít jeden typ DbContext. To v současné době vyžaduje přesun migrací do samostatného sestavení. Pokyny k nastavení projektů najdete v tématu Použití samostatného projektu migrace.

Tip

Ukázku pro tento článek najdete na GitHubu.

Argumenty můžete do aplikace předat z nástrojů. To může umožnit efektivnější pracovní postup, který se při spouštění nástrojů nebude muset v projektu ručně měnit.

Tady je jeden vzor, který funguje dobře při použití obecného hostitele.

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

Vzhledem k tomu, že výchozí tvůrce hostitelů čte konfiguraci z argumentů příkazového řádku, můžete při spuštění nástrojů určit zprostředkovatele.

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

Tip

Token -- směruje dotnet ef na zpracování všeho, co následuje jako argument, a nepokouší se je analyzovat jako možnosti. Všechny nadbytečné argumenty, které dotnet ef aplikace nepoužívá, se předávají do aplikace.