Я использую EF 6.0 для своего проекта в C # с ручными миграциями и обновлениями. У меня есть около 5 миграций в базе данных, но я понял, что последняя миграция была неудачной, и я не хочу этого. Я знаю, что могу вернуться к предыдущей миграции, но когда я добавляю новую (фиксированную) миграцию и запускаю Update-Database, применяется даже плохая миграция.
Я пытался откатиться до предыдущей миграции и удалить файл с ошибочной миграцией. Но затем, когда я пытаюсь добавить новую миграцию, я получаю ошибку при обновлении базы данных, потому что файл миграции поврежден (точнее, первая строка кода переименовывает таблицу A в B и является следующей строкой, EF пытается обновить таблицу с помощью имя А - возможно, это какая-то ошибка EF).
Могу ли я выполнить какой-нибудь запрос, который скажет EF что-то вроде «Забудьте последнюю миграцию, как будто ее никогда не было, это было плохо»? Что-то вроде Remove-Migration.
Edit1
Я нашел решение, подходящее для меня. Меняем модель до хорошего состояния и запуска Add-Migration TheBadMigration -Force
. Это перенастроит последнюю, не примененную миграцию.
Во всяком случае, это все еще не полностью отвечает на первоначальный вопрос. Если я обновлю базу данных до плохой миграции, я не нашел хорошего способа откатить и создать новую миграцию, кроме плохой.
Спасибо
источник
Ответы:
У вас есть 2 варианта:
Вы можете взять Даун из неудачной миграции и поместить его в новую миграцию (вам также необходимо будет внести последующие изменения в модель). Это эффективно сворачивается к лучшей версии.
Я использую эту опцию для вещей, которые были в нескольких средах.
Другой вариант - запустить
Update-Database –TargetMigration: TheLastGoodMigration
вашу развернутую базу данных, а затем удалить миграцию из вашего решения. Это своего рода альтернатива hulk smash и требует, чтобы это выполнялось для любой базы данных, развернутой с неверной версией.Примечание: чтобы переназначить миграцию, которую вы можете использовать
Add-Migration [existingname] -Force
. Это, однако, перезапишет существующую миграцию, поэтому обязательно делайте это, только если вы удалили существующую миграцию из базы данных. Это делает то же самое, что удаление существующего файла миграции и запускadd-migration
Я использую эту опцию при разработке.
источник
Как показывает вопрос, это относится к миграции в среде типа разработки, которая еще не была выпущена.
Эта проблема может быть решена с помощью следующих шагов: восстановить вашу базу данных до последней удачной миграции, удалить неудачную миграцию из вашего проекта Entity Framework, сгенерировать новую миграцию и применить ее к базе данных. Примечание: Судя по комментариям, эти точные команды могут больше не применяться, если вы используете EF Core.
Шаг 1. Восстановите предыдущую миграцию
Если вы еще не применили свою миграцию, вы можете пропустить эту часть. Чтобы восстановить схему базы данных до предыдущей точки, введите команду Update-Database с параметром -TargetMigration, чтобы указать последний удачный перенос. Если код вашей сущностной структуры находится в другом проекте в вашем решении, вам может потребоваться использовать параметр «-Project» или переключить проект по умолчанию в консоли диспетчера пакетов.
Чтобы получить имя последней удачной миграции, используйте команду «Get-Migrations», чтобы получить список имен миграции, которые были применены к вашей базе данных.
Этот список сначала показывает самые последние примененные миграции. Выберите миграцию, которая происходит в списке после того, на который вы хотите понизить рейтинг, то есть тот, который применен перед тем, на который вы хотите понизить рейтинг. Теперь выполните обновление базы данных.
Все миграции, примененные после указанного, будут понижены в порядке, начиная с самой последней, примененной первой.
Шаг 2: Удалить вашу миграцию из проекта
Если
remove-migration
команда недоступна в вашей версии Entity Framework, удалите файлы нежелательной миграции в папку «Миграции» проекта EF вручную. На этом этапе вы можете создать новую миграцию и применить ее к базе данных.Шаг 3. Добавьте новую миграцию
Шаг 4: применить вашу миграцию к базе данных
источник
add-migration "new migration"
,update-database
Для тех, кто использует EF Core с ASP.NET Core v1.0.0, у меня была похожая проблема, и я использовал следующие команды для ее исправления (пост @ DavidSopko указал мне правильное направление, но детали для EF Core немного отличаются) :
Например, в моей текущей разработке команда стала
Remove-Migration удалит последнюю примененную миграцию. Если вам нужно удалить более сложный сценарий с несколькими миграциями (у меня было только 2, начальный и плохой), я предлагаю вам протестировать шаги в фиктивном проекте.
В настоящее время в EF Core (v1.0.0), по-видимому, нет команды Get-Migrations, поэтому вы должны заглянуть в папку миграции и ознакомиться с тем, что вы сделали. Тем не менее, есть хорошая справочная команда:
При обновлении базы данных в VS2015 SQL Server Object Explorer все мои данные были сохранены, и миграция, которую я хотел отменить, исчезла :)
Первоначально я попытался удалить-Migration самостоятельно и нашел команду ошибки смущающей:
Уже есть предложения по улучшению этой формулировки, но я бы хотел, чтобы ошибка говорила что-то вроде этого:
Вывод из справочной команды EF Core следующий:
источник
Вы также можете использовать
Это вернет и удалит последнюю примененную миграцию
источник
Во-первых, обновите вашу последнюю совершенную миграцию с помощью этой команды:
Пример:
Затем удалите неиспользованную миграцию вручную.
источник
Update-Database 20180906131107_xxxx_xxxx
(без дефиса) работал на меня. Ни одна версияTargetMigration
как переключатель не работает. Эти команды кажутся движущейся целью (т.е. меняют их в каждой версии)?Начиная с .NET Core 2.2,
TargetMigration
похоже, уже нет:Так что это работает для меня сейчас:
А также (без
-Migration
переключателя):В добавленной заметке вы больше не можете чисто удалять папки миграции, не отключая синхронизацию снимка модели. Так что, если вы усвоите этот трудный путь и в итоге получите пустую миграцию, в которой вы знаете, что должны быть изменения, вы можете запустить (без переключателей, необходимых для последней миграции):
Это очистит беспорядок и вернет вас туда, где вы должны быть, даже если последняя папка миграции была удалена вручную.
источник
Для EF 6 вот одна строка, если вы много работаете в процессе разработки. Просто обновите vars и затем продолжайте использовать стрелку вверх в консоли диспетчера пакетов, чтобы промыть и повторить.
Почему это необходимо, спросите вы? Не уверен, к каким версиям EF6 это применимо, но если ваша новая цель миграции уже была применена, то использование '-Force' для повторной сборки в Add-Migration фактически не приведет к повторной сборке, но вместо этого создаст новый файл (это хороший вещь, хотя, потому что вы не хотели бы потерять свой «Вниз»). Приведенный выше фрагмент сначала выполняет 'Down', если необходимо, затем -Force работает правильно для повторного создания леса.
источник