Миграция кода объекта 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

Ваша база данных будет обновлена ​​до последней схемы и готова.

надеюсь, что это поможет.