EF Core多个迁移集合

7
我目前正在使用EF Core Code First Migrations开发.Net Core应用程序。我在Windows和OS X之间切换来进行开发(在家使用Windows,在外出时使用Mac),我正在尝试弄清楚如何在Windows上使用数据库迁移来处理SQL Server,而在Mac上则使用SQLite。
是否可以维护两组迁移并选择要应用的集合(无需逐个指定每个迁移)?或者,我需要创建单独的.Net Core应用程序/程序集,并为“dotnet ef database update”命令指定“--assembly”选项?
1个回答

5
你有两个选择:
  1. 使用两种Migration集合
  2. 手动编辑Migrations以使其与提供程序无关

多个集合

每个集合需要在自己的程序集中。要开始,请生成第一个Migration并将其移动到新项目中。当配置提供程序时,您将配置Migration组装。

optionsBuilder.UseSqlServer(
    mssqlConnectionString
    , x => x.MigrationsAssembly("MyApp.Migrations.SqlServer"));
//optionsBuilder.UseSqlite(
//    sqliteConnectionString,
//    x => x.MigrationsAssembly("MyApp.Migrations.Sqlite"));

我有一个示例,将迁移放在它们自己的程序集中,您可能还希望将其用作参考。

跨数据库提供程序

为了使迁移跨数据库提供程序,合并每个提供程序生成的内容。例如,以下内容包含了针对SQL Server和SQLite的注释。

migrationBuilder.CreateTable(
    name: "People",
    columns: table => new
    {
        Id = table.Column<int>(nullable: false)
            .Annotation("Sqlite:Autoincrement", true)
            .Annotation("SqlServer:ValueGenerationStrategy",
                SqlServerValueGenerationStrategy.IdentityColumn)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_People", x => x.Id);
    });

那非常有帮助!听起来,无论如何都需要进行某种类型的手动编辑?无论是将迁移移动到另一个程序集中,还是直接向迁移添加所需数据;这正确吗? - willwolfram18
1
是的。我们曾经考虑过为多提供程序模型添加使用迁移的一流支持(请参见#1825),但成本非常高。目前,我们只努力让您手动完成它。 - bricelam
当我运行 dotnet ef migrations add Sample --project ..\MyApp.Migrations 时,我会得到 Unrecognized option --project 的错误提示。同时在 Github 上也注意到了 这个问题。由于它被标记为“closed-wont-fix”,这是否意味着示例存储库已过时? - willwolfram18
1
@Bwolfing,GitHub问题与此无关(它是关于--project-dir的)。确保您正在使用1.0.0或1.1.0 RTM软件包。看看--help是否有效。 - bricelam
通过将工具更改为1.0.0(建议如此),并从project.json升级到.Net Core 1.1的.csproj格式,我成功解决了这个问题。 - willwolfram18
我最初认为迁移是为了简化数据库脚本管理,但是当涉及到多个提供程序时,它变得非常困难。我认为微软应该发布带有限制的所有功能。现在我处于这样一种情况:我花费了大量时间,而微软却决定不支持多个提供程序的数据库迁移!!! - Jay

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