Я пытаюсь создать миграцию между базами данных с помощью EF Core 2.0.
Когда я нахожусь в офисе, я работаю с командой, используя общую базу данных сервера sql. По этой причине код использует конфигурацию, которая ссылается на поставщика сервера SQL.
optionsBuilder.UseSqlServer(connectionString, serverOptions => {
serverOptions.MigrationsHistoryTable("__EFMigrations", "dbo");
});
Когда создается новая миграция, код миграции использует определенную конфигурацию поставщика сервера sql, например
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
.
Когда я вне офиса, я использую экземпляр postgreSQL, установленный на моем Mac, и мне нужна немного другая миграция, в которой используется конкретный поставщик postgreSQL.
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn),
Я знаю, что могу вручную изменить миграцию, чтобы указать обе аннотации, поскольку это не влияет на работу с базой данных определенного типа.
Однако ручное изменение миграции — утомительная и подверженная ошибкам работа, которую я хотел бы избежать.
Есть ли способ заставить EF автоматически генерировать оба метода аннотации?
Я также попытался использовать метод DbContext OnModelCreating, указав параметры в ModelBuilder.
modelBuilder
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
or
modelBuilder.ForNpgsqlUseSerialColumns();
modelBuilder.ForSqlServerUseIdentityColumns();
но сгенерированная миграция всегда связана с провайдером, используемым в этот конкретный момент.