Обновление базы данных EF Core указывает базовую версию - PullRequest
3 голосов
/ 10 апреля 2019

В моих проектах у меня есть два файла миграции ядра EF в папке Migrations, которые я создал на основе начального выпуска и после обновления.Начальная миграция («Initial») содержит много операторов CreateTable, тогда как вторая миграция («Cleanup») содержит только несколько операторов DropColumn в их Up методах.

Моя база данных была созданавызов context.Database.EnsureCreated() между первой и второй миграцией, т.е. я бы хотел выполнить вторую миграцию.Однако, если я звоню dotnet ef database update Cleanup, я получаю сообщение об ошибке:

Applying migration '20190409043916_Initial'.
Failed executing DbCommand (6ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [LongRunningOperations] (
    [Id] bigint NOT NULL IDENTITY,
    [Start] datetime2 NOT NULL,
    [End] datetime2 NULL,
    [Discriminator] nvarchar(max) NOT NULL,
    CONSTRAINT [PK_LongRunningOperations] PRIMARY KEY ([Id])
);
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'LongRunningOperations' in the database.

Очевидно, что EF также хочет применить первую миграцию.Есть ли возможность указать базовую версию базы данных?Могу ли я сделать что-то еще, чтобы избежать выполнения «начальной» миграции?

Более общий вопрос, который может помочь мне понять, что происходит: как EF Core определяет, что такое базовая версия, то есть какие миграции должны быть выполнены?казнят?

1 Ответ

2 голосов
/ 10 апреля 2019

Моя база данных была создана с помощью вызова context.Database.EnsureCreated()

В этом корень проблемы.Документация для API создания и удаления содержит следующее:

Предупреждение

EnsureCreated и миграции не работают вместе.Если вы используете миграцию, не используйте EnsureCreated для инициализации схемы.

, а затем:

Переход от EnsureCreated к миграции не является бесшовным опытом.Самый простой способ сделать это - удалить базу данных и заново создать ее с помощью миграции.Если вы планируете использовать миграции в будущем, лучше всего начать с миграций, а не с EnsureCreated.

Аналогично Применение миграций во время выполнения :

Предупреждение

  • Не звоните EnsureCreated() до Migrate().EnsureCreated() обходит Миграции для создания схемы, что приводит к сбою Migrate().

Вскоре вы должны были использовать инструменты EF Core или context.Database.Migrate() для создания / обновления базы данных.

Поскольку вы сделали это неправильно, либо следуйте их рекомендациям, чтобы "удалить базу данных и заново создать ее с помощью миграций" , либо попытайтесь восстановить таблицу истории миграций способ, которым EF Core изначально создал бы и заполнил бы его, если бы вы использовали предполагаемый рабочий процесс миграции.

...