Миграция кода объекта Entity Framework - застрял в начальной миграции
Я добавил EF 5 в свой проект через Nuget и включил миграции с помощью команды "Enable-Migrations". Затем я назвал "Add-Migration" для генерации базового кода для генерации схемы.
Затем я добавил свойство одному из моих объектов домена (свойство string, называемому "TestProperty" ) и добавил сопоставление в файл EntityTypeConfiguration (мы игнорируем соглашения на данный момент).
Вызов "Add-Migration" снова вызывает ошибку:
Unable to generate an explicit migration because the following explicit migrations are pending: [201303262144218_Initial]. Apply the pending explicit migrations before attempting to generate a new explicit migration.
Но вызов "Update-Database" создает исключение sql, поскольку таблицы уже существуют:
There is already an object named 'Customer' in the database
В моем конструкторе для моего DbContext я пробовал различные стратегии обновления, например:
Database.SetInitializer<UnitOfWork>(new DropCreateDatabaseAlways<UnitOfWork>());
Я пропустил что-то очевидное?
Я попробовал решение здесь, но это не сработало: Автоматические миграции для ASP.NET
Спасибо
EDIT: обновление
Ключом к прохождению первого шага является создание начальной миграции, а затем удаление сгенерированного кода из методов Up и Down (http://thedatafarm.com/blog/data-access/using-ef-migrations-with-an-existing-database/).
Затем я смогу обновить модель и карту EF, а затем запустить Add-Migration. Это создает миграцию с правильным кодом Up и Down.
Проблема заключается в попытке применить обновление. Update-Database создает ошибку "Невозможно обновить базу данных, чтобы она соответствовала текущей модели, потому что есть ожидающие изменения и автоматическая миграция отключена... автоматическая миграция. Установите DbMigrationsConfiguration.AutomaticMigrationsEnabled в true, чтобы включить автоматическую миграцию.
Вы можете использовать команду "Добавить-Миграция", чтобы записать изменения ожидающих моделей в перенос на основе кода ". Хорошо, поэтому я снова пытаюсь выполнить добавление-перенаправление и производит другую миграцию с тем же кодом, что и последний.
Я запускаю Update-Database и снова получаю ту же ошибку. Я пытаюсь "Update-Database -TargetMigration 201304080859556_MyMigration -Force", но это создает "Указанная целевая миграция" 201304080859556_MyMigration "не существует. Убедитесь, что целевая миграция относится к существующему идентификатору миграции" - он делает!
Очень расстраивает!
Ответы
Ответ 1
У меня была та же проблема, что и EF-миграция для первой модели кода с существующей базой данных, и работала следующая процедура:
- Удалите существующую папку Migrations в вашем проекте и DROP таблицу
__MigrationHistory
из существующей базы данных.
- Запустите команду
enable-migrations
в консоли диспетчера пакетов.
- Запустите команду
add-migration
, чтобы создать начальную миграцию.
- Удалите весь код в методе
Up()
для начальной миграции.
- Запустите команду
update-database
, чтобы применить первоначальную миграцию в вашу базу данных.
Это не вносит никаких изменений в существующие объекты (поскольку метод Up()
не содержит кода), но он отмечает существующую базу данных как перенесенную в исходное состояние.
- Внесите изменения в свою первую кодовую модель.
- Запустите команду
add-migration
, чтобы создать новую миграцию.
Код в методе Up()
новой миграции будет содержать только изменения в вашей объектной модели.
- Запустите команду
update-database
, чтобы применить изменения в своей базе данных.
Ответ 2
Я запускаю Update-Database и снова получаю ту же ошибку. Я пытаюсь "Update-Database -TargetMigration 201304080859556_MyMigration -Force", но это создает "Указанная целевая миграция" 201304080859556_MyMigration "не существует. Убедитесь, что целевая миграция относится к существующему идентификатору миграции" - он делает!
Есть еще одна проблема, которая может привести к вашей последней ошибке (и, возможно, это первопричина предыдущих). У меня была аналогичная проблема, и оказалось, что по какой-то странной причине некоторые из моих классов миграции, где в другом пространстве имен, чем пространство имен моего класса MigrationConfiguration
. Коррекция пространств имен (также в файлах xxx.Designer.cs
) решила эту проблему (миграции были видны и снова работали).
Ответ 3
Пробовал ли вы использовать параметр -force, чтобы применить изменения.
Update-Database [-SourceMigration <String>]
[-TargetMigration <String>] [-Script] [-Force] [-ProjectName <String>]
[-StartUpProjectName <String>] [-ConfigurationTypeName <String>]
[-ConnectionStringName <String>] [<CommonParameters>]
-Force
Указывает, что потеря данных приемлема во время автоматической миграции
базы данных.
Вы можете использовать get-help Update-Database -examples
для просмотра примеров использования.
Далее читайте: Первые миграции EF-кода
Ответ 4
Это обычный подход, который обычно работает:
- Удалите всю папку Migrations (убедитесь, что вы скопировали код, который вы создали из метода seed в файле конфигурации миграции).
- Удалить фактическую базу данных. Если вы используете LocalDb, это обычно будет находиться в папке с решением AppData (щелкните правой кнопкой мыши → открыть папку). Обязательно удалите файлы базы данных .mdf и .log.
- Перейдите в консоль диспетчера пакетов. Введите
enable-migrations -projectname yourprojectname
- Перейдите в консоль диспетчера пакетов. Введите
add-migration "Initial" -projectname yourprojectname
.
- Откройте файл конфигурации миграции и вставьте код, который вы скопировали с шага 1, в метод семени.
- Перейдите в консоль диспетчера пакетов. Введите
update-database -projectname yourprojectname
Это должно сделать трюк.
Ответ 5
Попытка перенести старую версию db на новую модель, либо база данных не соответствовала новой модели, либо я получил ошибки, например:
Тип не разрешен для элемента Npgsql.PostgresException, Npgsql, Версия = 3.2.2.0, Культура = нейтраль, PublicKeyToken = 5d8b90d52f46fda7 '
Вот как это работает (с использованием автоматической миграции):
- Удалить папку Migrations
- Выполнять разрешения-миграции
-
Установите для этих двух свойств значение true во вновь созданной Configuration.cs
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
-
Выполнить обновление-База данных -Force
Ваша база данных будет обновлена до последней схемы и готова.
надеюсь, что это поможет.