Миграция между базами данных EF Core 2

Я пытаюсь создать миграцию между базами данных с помощью 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();

но сгенерированная миграция всегда связана с провайдером, используемым в этот конкретный момент.




Ответы (1)


Невозможно заставить EF Core сделать это за вас. То, что вы делаете, это лучший подход. Чуть менее утомительный подход — хранить два отдельных набора миграций — по одному для каждого провайдера.

См. раздел Миграции EF Core с несколькими поставщиками. подробнее.

person bricelam    schedule 10.01.2018
comment
Спасибо за Ваш ответ. Я полностью пропустил связанную страницу. Кроме того, я думаю, что подход к созданию нового типа, производного от DbContext, может быть хорошим компромиссом. Забавно, что вы ответили на этот вопрос и сотрудничали со связанным постом: это абсолютно означает, что у меня есть наилучший ответ :) - person Lorenzo; 10.01.2018
comment
лол, и я написал код для миграции EF Core. Я не знаю, лучший ли это ответ, но я очень надеюсь, что он хороший. ;-) - person bricelam; 11.01.2018