Migracje z wieloma dostawcami

Narzędzia EF Core Tools tylko migracje szkieletów dla aktywnego dostawcy. Czasami jednak możesz chcieć użyć więcej niż jednego dostawcy (na przykład Microsoft SQL Server i SQLite) z bazą danych DbContext. Zajmij się tym, utrzymując wiele zestawów migracji — jeden dla każdego dostawcy — i dodając migrację do każdej zmiany modelu.

Korzystanie z wielu typów kontekstowych

Jednym ze sposobów tworzenia wielu zestawów migracji jest użycie jednego typu DbContext dla dostawcy.

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

Określ typ kontekstu podczas dodawania nowych migracji.

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

Napiwek

Nie musisz określać katalogu wyjściowego dla kolejnych migracji, ponieważ są one tworzone jako elementy równorzędne do ostatniego.

Używanie jednego typu kontekstu

Można również użyć jednego typu DbContext. Obecnie wymaga to przeniesienia migracji do oddzielnego zestawu. Aby uzyskać instrukcje dotyczące konfigurowania projektów, zapoznaj się z artykułem Using a Separate Migrations Project (Korzystanie z oddzielnego projektu migracji).

Napiwek

Przykład z tego artykułu można zobaczyć w witrynie GitHub.

Argumenty można przekazać do aplikacji z narzędzi. Może to umożliwić usprawniony przepływ pracy, który pozwala uniknąć konieczności ręcznego wprowadzania zmian w projekcie podczas uruchamiania narzędzi.

Oto jeden wzorzec, który dobrze sprawdza się podczas korzystania z hosta ogólnego.

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

Ponieważ domyślny konstruktor hosta odczytuje konfigurację z argumentów wiersza polecenia, można określić dostawcę podczas uruchamiania narzędzi.

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

Napiwek

Token -- kieruje do traktowania wszystkiego, co następuje dotnet ef jako argument i nie próbuje przeanalizować ich jako opcji. Wszelkie dodatkowe argumenty, które nie są używane przez dotnet ef usługę, są przekazywane do aplikacji.