Entity Framework Core 2.0,SQL Server 和 Postgres 的迁移?

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 和迁移。

到目前为止,我的尝试失败了:

  1. 为迁移创建单独的项目,一个用于 SQL Server 迁移,一个用于 Postgres 迁移。然后运行“ef migrations add ...”,其中“-p”参数指向我要使用的迁移项目。这是结合调用“.UseNpgsql(connectionString, o => o.MigrationsAssembly(..)”或“.UseSqlServer(connectionString, o => o.MigrationsAssembly(..)”)来完成的。工具会失败。抱怨没有找到 DataContext。

  2. 与“1”相同。但我们还在每个迁移项目中添加了一个实现“IDesignTimeDbContextFactory<..>”的类。此操作失败,工具抱怨没有找到 DataContext。

  3. 将 SQL Server 迁移保留在与 DataContext 相同的项目中。调用“ef migrations add ..”,并使用“-o”参数指定 Postgres 迁移的另一个输出文件夹。这适用于 SQL Server 迁移,但对于 Postgres 迁移会失败,因为它不喜欢同一项目中存在同名的迁移(即使它位于另一个文件夹中),而且迁移是为SQL Server 而不是 Postgres,即使它们放在指定的文件夹中。

这是当前不支持的场景吗?我们应该在所有平台上坚持使用 Postgres 吗?(这确实有效)。

Tur*_*ool 1

您的设置已得到官方支持。请参阅使用多个提供程序进行迁移

您应该为每个提供程序指定单独的程序集和连接字符串,如下所示:

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