Перенос данных 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 с изменениями.
Ответы
Ответ 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; }