Миграции с несколькими поставщиками
Миграция шаблонов только для активного поставщика средств 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
приложением, перенаправляются в приложение.