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.