2012-03-29 2 views
6

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

Однако некоторые миграции на основе кода существуют в папке 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. Удалить другие миграции из папки Миграции, запустите команду Add-Migration, обновить базу данных, а затем восстановить старые миграции. Это просто, но кажется немного хакерским.
  2. Вернитесь к версии модели в исходном элементе управления, к которой была применена первая миграция, затем создайте ее и используйте для создания базы данных. Затем получите последнюю версию, примените все миграции, затем я готов добавить свою миграцию. Это похоже на много усилий!
  3. Создайте миграцию вручную.

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

ответ

2

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

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

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

2

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

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

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

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

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

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

DadCat

1

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

Update-database 

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

Add-Migration YourMigrationName 

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

+1

Это не работает, потому что предыдущие операции миграции не могут выполняться в базе данных, созданной с использованием 'DbContext.Database.Create()'. Представьте себе миграцию, которая добавляет столбец, но в вашей новой локальной базе данных у вас уже есть этот столбец, поэтому вы получаете 'SqlException', и соответствующая строка никогда не добавляется в таблицу' __MigrationHistory'. См. Мой ответ за то, что я считаю правильным. –

1

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

0

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