Neo*_*que 5 sql-server postgresql entity-framework-core entity-framework-migrations
使用 Entity Framework Core 2.0,如果我的应用程序需要能够针对这两种类型,我如何在同一解决方案中保留 Microsoft SQL Server 和 Postgres 的迁移?就我而言,如果在 MacOS 上运行,我想使用 Postgres,如果在 Windows 上运行,我想使用 SQL Server。在设置 DataContext 之前,我们使用调用“RuntimeInformation.IsOSPlatform(..)”来确定平台并提取适当的连接字符串。
目前,该解决方案分为一个 ASP.NET Core 项目和一个“Data”项目,该项目仅保留 SQL Server 的 DataContext 和迁移。
到目前为止,我的尝试失败了:
为迁移创建单独的项目,一个用于 SQL Server 迁移,一个用于 Postgres 迁移。然后运行“ef migrations add ...”,其中“-p”参数指向我要使用的迁移项目。这是结合调用“.UseNpgsql(connectionString, o => o.MigrationsAssembly(..)”或“.UseSqlServer(connectionString, o => o.MigrationsAssembly(..)”)来完成的。工具会失败。抱怨没有找到 DataContext。
与“1”相同。但我们还在每个迁移项目中添加了一个实现“IDesignTimeDbContextFactory<..>”的类。此操作失败,工具抱怨没有找到 DataContext。
将 SQL Server 迁移保留在与 DataContext 相同的项目中。调用“ef migrations add ..”,并使用“-o”参数指定 Postgres 迁移的另一个输出文件夹。这适用于 SQL Server 迁移,但对于 Postgres 迁移会失败,因为它不喜欢同一项目中存在同名的迁移(即使它位于另一个文件夹中),而且迁移是为SQL Server 而不是 Postgres,即使它们放在指定的文件夹中。
这是当前不支持的场景吗?我们应该在所有平台上坚持使用 Postgres 吗?(这确实有效)。
您的设置已得到官方支持。请参阅使用多个提供程序进行迁移。
您应该为每个提供程序指定单独的程序集和连接字符串,如下所示:
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}")
});
});
Run Code Online (Sandbox Code Playgroud)
然后您可以在创建迁移时指定提供者。
dotnet ef migrations add MyMigration --project ../SqliteMigrations -- --provider Sqlite
| 归档时间: |
|
| 查看次数: |
2509 次 |
| 最近记录: |