EF Core 工具仅为活动提供程序提供基架迁移。 但是,有时,你可能希望对 DbContext 使用多个提供程序(例如Microsoft SQL Server 和 SQLite)。 通过维护多组迁移集(每个提供程序一组),并在每次模型更改时为每一迁移集添加新的迁移来处理此问题。
使用多个上下文类型
创建多个迁移集的一种方法是对每个提供程序使用一个 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
Tip
不需要为后续迁移指定输出目录,因为它们是作为最后一个迁移的同级创建的。
使用一种上下文类型
也可以使用一种 DbContext 类型。 目前,这需要将迁移移动到单独的程序集中。 有关设置项目的说明,请参阅 使用单独的迁移项目 。
Tip
可以在 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
Tip
-- 标记指示 dotnet ef 将后面的所有内容都视为参数,而不要试图将它们解析为选项。
dotnet ef 未使用的任何额外参数都会转发到应用。