Миграции с несколькими поставщиками

Миграция шаблонов только для активного поставщика средств EF Core. Однако иногда может потребоваться использовать несколько поставщиков (например, Microsoft SQL Server и SQLite) с dbContext. Это можно сделать, сохраняя несколько наборов миграций— один для каждого поставщика и добавляя миграцию к каждой из них для каждого изменения модели.

Использование нескольких типов контекста

Один из способов создания нескольких наборов миграции — использовать один тип DbContext для каждого поставщика.

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

Укажите тип контекста при добавлении новых миграций.

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

Совет

Вы не должны указывать выходной каталог для последующих миграций, так как они создаются как братья и сестры до последнего.

Использование одного типа контекста

Также можно использовать один тип DbContext. В настоящее время требуется перемещение миграций в отдельную сборку. Дополнительные сведения о настройке проектов см. в разделе "Использование отдельного проекта миграции".

Совет

Вы можете скачать используемый в этой статье пример из репозитория GitHub.

Аргументы можно передать в приложение из средств. Это может обеспечить более упрощенный рабочий процесс, который позволяет избежать необходимости вносить изменения вручную в проект при запуске средств.

Ниже приведен один шаблон, который хорошо работает при использовании универсального узла.

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

Так как построитель узлов по умолчанию считывает конфигурацию из аргументов командной строки, можно указать поставщика при запуске средств.

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

Совет

Маркер -- направляет dotnet ef для обработки всего следующего как аргумента и не пытается проанализировать их как параметры. Все дополнительные аргументы, не используемые dotnet ef приложением, перенаправляются в приложение.