В моих проектах у меня есть два основных файла миграции EF в папке «Миграции», которые я создал на основе первоначального выпуска и после обновления. Первоначальная миграция («Начальная») содержит много операторов CreateTable
, тогда как вторая миграция («Очистка») содержит только несколько операторов 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 определяет базовую версию, т. е. какие миграции необходимо выполнить?
@JAZ верен, таблица, которую вы ищете, это __EFMigrationsHistory
, а MigrationId
должно соответствовать имени вашей миграции (например, «20190410160507_LongRunningOperations»)
спасибо, это все. Вы можете сделать это ответом, если хотите.
My database was created by a call to
context.Database.EnsureCreated()
Это корень проблемы. Документация для Создание и удаление API содержит следующее:
Warning
EnsureCreated and Migrations don't work well together. If you're using Migrations, don't use EnsureCreated to initialize the schema.
а потом:
Transitioning from EnsureCreated to Migrations is not a seamless experience. The simplest way to do it is to drop the database and re-create it using Migrations. If you anticipate using migrations in the future, it's best to just start with Migrations instead of using EnsureCreated.
Аналогично в Применение миграций во время выполнения:
Warning
- Don't call
EnsureCreated()
beforeMigrate()
.EnsureCreated()
bypasses Migrations to create the schema, which causesMigrate()
to fail.
Короче говоря, вы должны были использовать либо инструменты EF Core, либо context.Database.Migrate()
для создания/обновления базы данных.
Поскольку вы сделали это неправильно, либо следуйте их рекомендации по "удалить базу данных и заново создать ее с помощью миграции", либо попытайтесь реконструировать Таблица истории миграций так, как EF Core создал бы и заполнил его изначально, если бы вы использовали предполагаемый рабочий процесс миграции.
Не слишком знаком с EF, но у большинства миграций баз данных есть таблица истории или что-то еще для отслеживания примененных миграций. Проверьте и добавьте эту запись миграции, и он должен подумать, что уже применил ее.