Подтвердить что ты не робот

Перенос данных EF Data не будет определять изменения при добавлении новой миграции

Я использую Entity Framework 5.0 Перенос данных вместе с кодом. Когда я добавляю новое поле в свою модель и выполняю следующую команду в консоли диспетчера пакетов.

 "Add-migration AddedField"

Все, что я получаю, это пустой перенос, называемый "n_AddedField", методы вверх и вниз не содержат логики.

Я попробовал кучу вещей, переустановил пакет EF nuget, очистил свое решение, перестроил, вручную удалил все сгенерированные файлы и каталоги.

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

Я понятия не имею, почему и как EF все еще помнит эти миграции. Я даже попытался найти через файловые ресурсы, глядя, что миграции были сохранены где-то в другом месте или что-то в этом роде. Но ничего..

Миграции данных выглядят очень аккуратно, когда scott hansleman демонстрирует это на сцене, но для реальной работы я начинаю искать альтернативы.

Когда проект запустился, мы использовали EF 4.x и некоторое время назад переключились на 5.0, но поскольку коммутатор я успешно добавил кучу миграции.

Кто-нибудь знает, как решить эту проблему? В основном я просто хочу иметь возможность добавлять миграции и генерировать sql script с изменениями.

4b9b3361

Ответ 1

У меня была аналогичная проблема, когда новая миграция не была найдена, поэтому update-database давала мне следующую ошибку, независимо от того, что я сделал:

Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration.
You can use the Add-Migration command to write the pending model changes to a code-based migration.

Выполнение "пакетной очистки" решило мою проблему, предполагая, что EF использует старую/недействительную сборку из папки, отличной от выбранной в настоящий момент "конфигурации решения (например, DEBUG)".

Сделать пакетную очистку:

  • Выберите Main Menu -> Build -> Batch Build...
  • Нажмите Select All
  • Нажмите Clean

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

Надеюсь, это поможет кому-то другому.

Ответ 2

упс. В моем случае я добавлял новый корневой объект, на который не ссылался какой-либо другой объект. Результатом было просто, что у кода сначала не было причин генерировать миграцию для объекта. Как только я добавил код в DbContext (dbset), он работал как шарм.

Ответ 3

У меня была такая же проблема, но выяснилось, что мое новое поле было добавлено как переменная-член, а не свойство - в ней отсутствовали {get; set;} и ​​что миграция пропускает это поле.

Возможно, это не ваш случай, но он может помочь кому-то другому.

Ответ 4

У меня была проблема, подобная этой, где использование флага -force на add-migration для повторной подмены существующей миграции перестало работать без видимых причин.

Независимо от того, что я сделал, я получил глупость "Не удалось создать явный переход, потому что следующие явные миграции ждут" сообщение об ошибке. Пробовав почти все, о чем я мог думать, и не останавливаясь, просто не разбив ноутбук на куски, из отчаяния я снова побежал enable-migrations и, конечно же, получил "Миграции уже включены в проект" Blah.Blah ". Пробовал add-migration -force снова и магически, он работал.

Я понятия не имею, что он изменил - должно быть, некоторые пользовательские настройки/файл конфигурации вне контроля источника. Надеюсь, это поможет кому-то другому.

Ответ 5

Вы "не синхронизированы" - Db, миграции, код - и вы можете ожидать всевозможные проблемы.

Я сделал это million times (почти:), и он работает очень хорошо - но вам нужно идти устойчиво и быть дотошным в том, что вы делаете.

Вы можете прочитать это "резюме", которое я сделал, - начните на полпути где-нибудь (но также проверьте соединение).

Код сначала создает таблицы

... и если это не сработает, я предлагаю вам создать небольшой "повторяемый" сценарий/модель - разместите именно то, что у вас есть.

Как работают миграции:

Миграции привязаны к таблице миграции.

Когда выполняется Add-Migration - он проверяет структуру "существующая база данных" и таблицу миграции - и делает "разницу" (иногда вы не получаете ни одного "вверх" вниз, просто так же синхронно).

Таким образом, каждая "миграция" представляет собой сложную разницу между вашим кодом, существующими миграциями и базой данных и таблицей миграции. Если не удалять базу данных, то ничего не может быть возможно для reset - таблица миграции "Db" может быть недостаточной - это не гарантирует полную "очистку" (если это возможно, я всегда делаю полное удаление Db). Вам также необходимо удалить миграцию кода.

Обязательно "скомпилируйте" проекты (лучше всего их автоматически скомпилировать в конфигурации) после/до, когда это необходимо.

Убедитесь, что ваше соединение установлено.

Как только все будет синхронизировано - все должно работать хорошо - но вы должны держать его в синхронизации. Если вы не планируете удалять Db (тестирование) - не удаляйте миграцию именно так (вы можете использовать Update-Database -0 (я думаю), чтобы вернуться к некоторой миграции (это "нулевое состояние" ).

Ответ 6

Вариант пакетной сборки → чистый не работал у меня.

Я решил проблему:

  • Создание миграции с помощью 'Add-Migration NameOfMigration'
  • Удаление содержимого функций "вверх" и "вниз" созданного класса миграции.
  • Обновление базы данных с помощью миграции script (которая просто добавит строку в таблицу _MigrationHistory с помощью "Обновить-База данных -Вербоза"

Теперь веб-приложение выполняется успешно, поэтому по существу у меня была проблема, которая была исправлена ​​добавлением только метаданных.

Ответ 7

Проблема в моем случае была вызвана:

  • Создать миграцию (успешно)
  • Решите, что я хочу его воссоздать, и удалите файл миграции .cs
  • Попробуйте восстановить его и закончите пустую миграцию Down и Up функции

В этом случае я забыл также удалить записи ApplicationDbContextModelSnapshot.cs для изменений модели. Удаление новых сопоставлений в этом файле решило мою проблему, и оно затем сгенерировано правильно.

Ответ 8

Кажется, что мне удалось решить проблему, перемещая модели и класс контекста в другой проект.

Я до сих пор не знаю, почему это произошло, и это решение на самом деле не является решением: (

Ответ 9

У меня была та же проблема. Миграции были включены, но они не обнаружили никаких изменений. Мое решение состояло в том, чтобы снова включить миграции с использованием атрибута -Force, а затем все сработало.

Enable-Migrations -ProjectName -StartupProjectName --ConnectionStringName -Force

Ответ 10

Мне пришлось удалить таблицу _MigrationHistory, созданную EF. Затем я снова выполнил добавленную миграцию. Будьте осторожны с этим, поскольку он будет генерировать запросы, необходимые с нуля, включая таблицы, которые уже есть.

Ответ 11

В моем случае это было потому, что я добавил дополнительный контекст "ApplicationDbContext" как часть содержимого идентификатора ASP.net. Когда я снова запустил команду enable-migrations, у меня возникла ошибка, когда было несколько контекстов. Однажды я объединил две вещи, которые снова начали работать.

Ответ 12

Может быть, самый глупый из всех:

Я добавлял миграцию с одним и тем же именем в качестве нового объекта, который я создавал.

Ответ 13

Я добавил новый класс в свою модель данных в подкаталог, результирующее пространство имен не было видно скаффолдингу, использующему add -igration.

Исправление состояло в том, чтобы переименовать пространство имен нового класса, чтобы оно соответствовало остальной части модели, и/или добавить "общедоступный виртуальный DbSet.." и т.д. В класс контекста сущности, что потребует от вас ссылки на это новое пространство имен, а затем выполните команду add- миграция снова.

Ответ 14

Не забудьте включить Public модификатор доступа:

public string Text { get; set; }