Entity Framework Core 2.0,如何为SQL Server和Postgres创建迁移?

4
如何使用 Entity Framework Core 2.0,在同一个解决方案中保留 Microsoft SQL Server 和 Postgres 的迁移,以便我的应用程序能够针对这两种类型进行目标设置?在我的情况下,如果在 MacOS 上运行,我想使用 Postgres,在 Windows 上运行时我想使用 SQL Server。在设置 DataContext 之前,我们使用调用 "RuntimeInformation.IsOSPlatform(..)" 并提取适当的连接字符串来确定平台。
当前解决方案分为一个 ASP.NET Core 项目和一个仅保留 SQL Server 的 "Data" 项目,其中包含 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 相同的项目中。使用 "-o" 参数调用 "ef migrations add ..",指定另一个输出文件夹以用于 Postgres 的迁移。这对 SQL Server 迁移有效,但对于 Postgres 迁移失败,因为它不喜欢在同一项目中存在具有相同名称的迁移(即使它们位于另一个文件夹中),并且即使将它们放在指定的文件夹中,迁移也是针对 SQL Server 生成的而不是针对 Postgres 生成的。
这是否是当前不支持的场景?我们应该坚持在所有平台上使用 Postgres 吗?(这可以正常工作)。

我刚刚写了一些关于这个主题的文档!告诉我还有什么需要补充的。 - undefined
嗨@NeoDarque,当我尝试从MS SQL迁移到PostgreSQL时,我也遇到了“未找到DataContext”的错误。为了解决这个错误,我在Postgre迁移项目中创建了DbContext。奇怪的是,引用DbContext并没有起作用。 - undefined
自2018年起,EF Core 2.0已完全停止支持,并且缺乏许多基本功能。正如发布的答案所示,有一个专门用于Migrations with Multiple Providers的文档页面。 - undefined
请将您的代码发布在问题文本之外,并包括实际的错误消息和实际的命令。现在很难理解您到底尝试了什么或出了什么问题。谈论DataContext而不是DbContext会增加混乱。您是尝试从DbContext派生吗,还是这是一个打字错误?您是否在正确的文件夹中运行了dotnet ef migrations?您是否指定了正确的项目? - undefined
1个回答

0

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

您应该为每个提供程序指定单独的程序集和连接字符串,就像这样:

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 ../SqliteMigrations -- --provider Sqlite

Turbcool,欢迎提供解决方案的链接,但请确保您的回答在没有链接的情况下也是有用的:在链接周围添加一些上下文,以便其他用户了解它的内容和存在的原因,然后引用您链接的页面中最相关的部分,以防目标页面无法访问。仅仅提供链接的答案可能会被删除。 - undefined
@KiranShahi 这里情况并非如此。提供一个链接到官方文档,详细解释如何逐步处理确切的问题,本身就是有用且非常稳定的。你可以说这应该是一个评论,因为我们还不了解足够的信息来给出更好的答案。但很有可能,楼主会在逐步指南中找到解决方案。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接