15

Я добавил EF 5 к моему проекту через Nuget и включил миграцию с помощью команды «Enable-Migrations». Затем я назвал «Add-Migration» для генерации базового кода для генерации схемы.Миграции интерфейсного модуля Entity Framework - застряли в начальной миграции

Затем я добавил свойство одному из моих объектов домена (строковое свойство, называемое «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>()); 

Am I missi Что-то очевидное? Я попробовал решение здесь, но это не сработало: Automatic Migrations for 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, чтобы включить автоматическую миграцию. Вы можете использовать Add- Команда «Миграция» для записи изменений ожидающей модели на перенос на основе кода ». Итак, я снова попробую Добавить-Миграцию, и он производит другую миграцию с тем же кодом, что и последний.

Я запустил Update-Database и снова получаю ту же ошибку. Я пытаюсь «Update-Database -TargetMigration 201304080859556_MyMigration -Force», но это создает «Указанная целевая миграция» 201304080859556_MyMigration «не существует. Убедитесь, что миграция цели относится к существующему идентификатору миграции» - он делает!

Очень расстраивает!

+0

Есть ли существующий файл в каталоге Migrations под названием 201303262144218_Initial.cs? – MattSull

+0

Да. Я немного смущен - начальная миграция должна быть пустой или предполагается создать базу данных в ее исходном состоянии? Кроме того, у меня нет таблицы __MigrationHistory (либо в моей базе данных, либо в Master). – SturmUndDrang

+0

Инициализация - это просто имя, данное этой миграции. Иногда люди называют свою первую миграцию начальной. Если у вас есть существующий db и запускается команда add-migration/update-database без внесения каких-либо изменений в классы модели, файл миграции будет пустым. Удалите файл 201303262144218_Initial.cs, а затем снова запустите две команды («add-migration newestMigration», затем «update-database». – MattSull

ответ

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 Code First Migrations

+0

Итак, я удалил начальную миграцию и запустил Enable-Migrations (with -Force) который не создал начальную миграцию.Я затем выполнил Add-Migration (указав строку подключения), которая создала миграцию, которая создает всю базу данных (а не только добавленное дополнительное свойство). – SturmUndDrang

+1

Затем я запускаю Update-Database с - FORCE, и я получаю «Невозможно обновить базу данных в соответствии с текущей моделью, потому что есть ожидающие изменения, и автоматическая миграция отключена. Либо записывайте ожидающие изменения модели в перенос на основе кода, либо разрешайте автоматическую миграцию». Почему так сложно получить это работает? – SturmUndDrang

+0

Я также попробовал флаг -examples. Он просто говорит: «NAME Update-Database SYNOPSIS Применяет любые ожидающие миграции в базу данных» без каких-либо примеров. – SturmUndDrang

0

Это подход одеяло, которое обычно работает:

  1. Удалить всю папку Миграции (убедитесь, что вы копируете код, который вы могли бы созданный из метода семян в ваш файл конфигурации миграции).
  2. Удалить фактическую базу данных. Если вы используете LocalDb, это обычно будет находиться в папке с решением AppData (щелкните правой кнопкой мыши -> открыть папку). Обязательно удалите файлы базы данных .mdf & .log.
  3. Перейти к консоли диспетчера пакетов. Введите enable-migrations -projectname yourprojectname
  4. Перейти к консоли диспетчера пакетов. Введите add-migration "Initial" -projectname yourprojectname.
  5. Откройте файл конфигурации миграции и вставьте код, который вы скопировали с шага 1, в метод семени.
  6. Перейти к консоли диспетчера пакетов. Введите update-database -projectname yourprojectname

Это должно сделать трюк.

4

I run Update-Database and get the same error again. I try "Update-Database -TargetMigration 201304080859556_MyMigration -Force" but this produces "The specified target migration '201304080859556_MyMigration' does not exist. Ensure that target migration refers to an existing migration id" - It does!

Есть еще одна проблема, которая может привести к вашей последней ошибке (и, возможно, это первопричина предыдущих). У меня была аналогичная проблема, и оказалось, что по какой-то странной причине некоторые из моих классов миграции, где в другом пространстве имен, чем пространство имен моего класса MigrationConfiguration. Исправление пространств имен (также в файлах xxx.Designer.cs) решило эту проблему (миграции были видны и снова работали).

+2

Сегодня я столкнулся с почти такой же проблемой (частичное имя класса в файле дизайнера было изменено, скорее всего, из-за слияния кода). Как только я исправил файл конструктора, я смог применить все мои миграции. – DVK

+0

Попробуйте «Update-Database -TargetMigration MyMigration -Force» – gorums

20

У меня была та же проблема, позволяя EF миграции для кода-первая модель с существующей базой данных, а следующая процедура работала:

  1. Удалить существующую папку Миграции в проекте, и DROP таблицу __MigrationHistory из существующей базы данных.
  2. Запустите команду enable-migrations из консоли диспетчера пакетов.
  3. Запустите команду add-migration, чтобы создать начальную миграцию.
  4. Удалите весь код в Up() метод начальной миграции.
  5. Запустите команду update-database, чтобы применить первоначальную миграцию в вашу базу данных. Это не вносит никаких изменений в существующие объекты (поскольку метод Up() не содержит кода), но он отмечает существующую базу данных как перенесенную в исходное состояние.
  6. Внесите изменения в свою первую кодовую модель.
  7. Запустите команду add-migration, чтобы создать новую миграцию. Код метода Up() новой миграции будет содержать только изменения в вашей объектной модели.
  8. Запустите команду update-database, чтобы применить изменения в своей базе данных.
+0

Если я опустил таблицу, она мне понадобится в будущем или она будет создана снова снова? –

+0

Таблица «__MigrationHistory» автоматически воссоздается EF при запуске команды «add-migration». – MrUpsideDown

+0

Я также обнаружил, что Visual Studio в некоторых случаях повреждает отслеживание изменений модели (например, множество изменений модели и миграции при рефакторинге для лучшего решения), и единственный способ исправить это - удалить таблицу migististory или вручную отменить изменения и удалите застрявшие миграции из таблицы migrationhistory. Я считаю, что отслеживание изменений модели EF иногда вызывает раздражение. У Laravel есть миграции, но нет отслеживания модели, и все работает отлично. Я думаю, это цена для отслеживания модели - дополнительная сложность и проблемы, когда вы хотите бороться с автоматическим отслеживанием EF. – JustAMartin

0

Попытка перенести старую дб версию на новую модель, либо база данных не соответствует новой модели или я получил ошибки как:

Type is not resolved for member 'Npgsql.PostgresException,Npgsql, Version=3.2.2.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7'

Вот как это работает (с использованием автоматической миграции) :

  1. Удалить папку миграции
  2. Execute позволяют-миграции
  3. Set эти два свойства к истинным в недавно созданный Configuration.cs

    public Configuration() 
    { 
        AutomaticMigrationsEnabled = true; 
        AutomaticMigrationDataLossAllowed = true; 
    } 
    
  4. Выполнить Update-Database -Force

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

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