EF Core 2跨数据库迁移

时间:2018-01-09 23:43:45

标签: entity-framework entity-framework-core ef-migrations ef-core-2.0 cross-database

我正在尝试使用EF Core 2.0

创建跨数据库迁移

当我在办公室时,我通过与团队一起使用共享的sql server数据库来工作。因此,代码使用引用sql server provider

的配置
optionsBuilder.UseSqlServer(connectionString, serverOptions => {
    serverOptions.MigrationsHistoryTable("__EFMigrations", "dbo");
});

创建新迁移时,这使迁移代码使用sql server provider的特定配置,如

migrationBuilder.CreateTable(
    name: "Customers",
    schema: "dbo",
    columns: table => new
    {
        EntityID = table.Column<int>(nullable: false)
            .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
        Name = table.Column<string>(maxLength: 255, nullable: false)
    },
    constraints: table => {
        table.PrimaryKey("PK_Customers", x => x.EntityID);
    });

请注意Annotation方法。

当我不在办公室时,我正在使用我的mac上安装的postgreSQL实例,我需要稍微不同的迁移才能使用特定的postgreSQL提供程序

.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn),

我知道我可以手动修改迁移以指定两个注释,因为这在特定数据库类型上运行时没有影响。

然而,手动修改迁移是一项繁琐且容易出错的工作,我希望避免这种情况。

有没有办法让EF自动生成两种注释方法?

我还尝试通过在ModelBuilder上指定选项来使用DbContext OnModelCreating方法

modelBuilder
    .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn)
    .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

modelBuilder.ForNpgsqlUseSerialColumns();
modelBuilder.ForSqlServerUseIdentityColumns();

但生成的迁移始终与特定时刻使用的提供程序相关。

1 个答案:

答案 0 :(得分:2)

无法让EF Core为您完成。你正在做的是最好的方法。稍微不那么繁琐的方法是保留两组独立的迁移 - 每个提供者一组。

有关详细信息,请参阅EF Core Migrations with Multiple Providers