Сделать EF4.3 Code First Migrations игнорировать ожидающие миграции - PullRequest
6 голосов
/ 29 марта 2012

У меня есть локальный экземпляр базы данных, которую я недавно создал с использованием DbContext.Database.Create(), поэтому таблица __MigrationHistory существует с записью InitalCreate, которая соответствует коду на данный момент.

Однако некоторые миграции на основе кода существуют в папке Migrations. Они будут запускаться в наших средах разработки и подготовки, чтобы привести эти базы данных в соответствие с кодом. Однако мне не нужно применять их локально, поскольку я создал базу данных, используя текущий код.

Теперь мне нужно внести изменения в модель и создать соответствующую миграцию. Но когда я запускаю Add-Migration TestMigration, я получаю следующую ошибку

Unable to generate an explicit migration because the following explicit 
migrations are pending: 

[201203271113060_AddTableX, 
 201203290856574_AlterColumnY]

Apply the pending explicit migrations before attempting to generate 
a new explicit migration.

Что мне делать в этом случае? Я не могу указать инструмент Add-Migration на другую среду, потому что не гарантируется, что версия совпадает с моей локальной версией. Я хочу выполнить миграцию, которая соответствует только внесенным мною изменениям.

Кажется, у меня есть несколько вариантов, но ни один из них не идеален:

  1. Удалите другие миграции из папки Migrations, выполните команду Add-Migration, обновите базу данных, а затем восстановите старые миграции. Это просто, но кажется немного хакерским.
  2. Вернитесь к версии модели в системе контроля версий, к которой была применена первая миграция, затем создайте ее и используйте для создания базы данных. Затем получите последнюю версию, примените все миграции, и я готов добавить свою миграцию. Это похоже на большие усилия!
  3. Создать миграцию вручную.

Есть ли у кого-нибудь предложения о том, как с этим справиться?

Ответы [ 5 ]

2 голосов
/ 05 ноября 2013

То, что я нашел, работает лучше всего очень просто: не используйте DbContext.Database.Create(), как только вы включили миграцию.Если вы хотите программно создать новую базу данных, используйте вместо этого API-интерфейс миграций.

var migrator = new DbMigrator(new Configuration());
migrator.Update();

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

2 голосов
/ 17 июля 2012

Мы планируем использовать вариант вашего варианта № 1 ...

Наша стандартная рабочая процедура заключается в создании сценария SQL для каждой миграции (с использованием опции -script для update-database), чтобы сценарии SQL применялись к «производственным» базам данных конечного пользователя с помощью InstallShield (мы планируем использовать EF update-database только для баз данных разработчиков).

Таким образом, в нашей папке Migrations есть и файлы .cs миграции, и соответствующие файлы .sql для всех миграций.

Таким образом, вместо удаления миграций из папки Migrations (как вы предложили в # 1), мы используем SQL Mgmt Studio, чтобы вручную применить только те части файлов .sql, которые выполняют вставки в _MigrationHistory.

Это приводит _MigrationHistory локальной базы данных в соответствие с изменениями, которые уже включены в эту базу данных.

Но это клочок, и мы все еще ищем лучшее решение.

DadCat

1 голос
/ 23 ноября 2015

Вам нужно либо запустить «update-database» из консоли диспетчера пакетов, чтобы отправить изменения в базу данных, либо вы можете удалить ожидающий файл миграции ([201203271113060_AddTableX]) из папки Migrations, а затем повторно запустить add- миграция ", чтобы создать новую миграцию, основанную на ваших изменениях.

1 голос
/ 04 ноября 2013

Я столкнулся с той же проблемой. Если вы запускаете

Update-database

, а затем запустить

Add-Migration YourMigrationName

Это решает проблему

0 голосов
/ 05 апреля 2017

просто исключите старый файл миграции из файлов решения.

...