Это выглядит как обычная задача, но я не могу найти простой способ сделать это.
Я хочу отменить последнюю примененную миграцию. Я бы ожидал простую команду, как
PM> Update-Database -TargetMigration:"-1"
Вместо этого все, что я могу придумать, это:
PM> Get-Migrations
Retrieving migrations that have been applied to the target database.
201208012131302_Add-SystemCategory
201207311827468_CategoryIdIsLong
201207232247409_AutomaticMigration
201207211340509_AutomaticMigration
201207200025294_InitialCreate
PM> Update-Database -TargetMigration:"CategoryIdIsLong"
(По крайней мере, я могу использовать только имя, пропуская метку времени ...)
Есть ли более простой способ?
entity-framework
entity-framework-4
database-migration
ef-migrations
Кристиан Дьяконеску
источник
источник
Ответы:
Начиная с EF 5.0, описанный вами подход является предпочтительным. Так
PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"
или используя ваш пример миграций
PM> Update-Database -TargetMigration:"CategoryIdIsLong"
Одним из решений было бы создание сценария PS-оболочки, который автоматизирует описанные выше шаги. Кроме того, не стесняйтесь создавать запрос функции для этого, или еще лучше, попробуйте его реализовать! https://github.com/dotnet/ef6
источник
dotnet ef database update LastGoodMigration
однако это сбивает с толку, так как я пришел из фона узла и использую knex, sequlize, у них есть команда, чтобы отменить последнее изменение, есть ли команда, чтобы отменить последнее действие, которое было применено к базе данных ?Я хочу добавить некоторые пояснения к этой теме:
То, что вы делаете выше, говорит, что вы хотите откатить все миграции до тех пор, пока у вас не останется указанная миграция. Таким образом, если вы используете GET-MIGRATIONS и обнаружите, что у вас есть A, B, C, D и E, то с помощью этой команды откат E и D приведет вас к C:
Кроме того, если кто-то не может прокомментировать обратное, я заметил, что вы можете использовать порядковое значение и короткий ключ -Target (таким образом, -Target - это то же самое, что и -TargetMigration). Если вы хотите откатить все миграции и начать заново, вы можете использовать:
0, выше, приведет к откату даже ПЕРВОЙ миграции ( это деструктивная команда - убедитесь, что вы знаете, что делаете, прежде чем ее использовать! ) - что вы не сможете сделать, если используете приведенный выше синтаксис, требующий имени целевая миграция (имя 0-й миграции не существует до применения миграции!). Так что в этом случае вы должны использовать значение 0 (порядковый номер). Аналогично, если вы применили миграции A, B, C, D и E (в этом порядке), то порядковый номер 1 должен ссылаться на A, порядковый номер 2 должен ссылаться на B и так далее. Таким образом, для отката на B вы можете использовать либо:
или
Изменить октябрь 2019 года:
Согласно этому связанному ответу на аналогичный вопрос, правильная команда
-Target
для EF Core 1.1, в то время как-Migration
для EF Core 2.0.источник
$InitialDatabase
.ls variable:*
его, похоже,$InitialDatabase
это просто переменная PowerShell, определенная как 0, другие не определены, даже в текущем исходном коде EF. И get-migrations ничего не возвращает, он только записывает в консоль, поэтому вы не можете перебирать возвращаемые объекты ...В EntityFrameworkCore :
где
20161012160749_AddedOrderToCourse
имя миграции, к которой вы хотите выполнить откат.источник
Решение:
источник
Дополнительное напоминание:
Если у вас несколько типов конфигурации, вам нужно указать [ConfigurationName]
источник
В EF Core вы можете ввести команду
Remove-Migration
в консоли диспетчера пакетов после добавления ошибочной миграции.Консоль предлагает вам сделать это, если ваша миграция может привести к потере данных:
источник
Предупреждение : Это откатит ВСЕ миграции в EFCore! Пожалуйста, используйте с осторожностью :)
источник
Я обнаружил, что это работает при запуске в консоли диспетчера пакетов:
dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }
Вы можете создать сценарий, который делает это проще.
источник
Я использую EntityFrameworkCore и использую ответ @MaciejLisCK. Если у вас несколько контекстов БД, вам также необходимо указать контекст, добавив параметр контекста, например:
Update-Database 201207211340509_MyMigration -context myDBcontext
(где
201207211340509_MyMigration
находится миграция, к которой вы хотите вернуться, иmyDBcontext
имя контекста вашей БД)источник
Для этой проблемы я предлагаю эту ссылку:
https://elegantcode.com/2012/04/12/entity-framework-migrations-tips/
источник
В случае, если есть вероятность, что dataloss EF не выполнит команду update-database, поскольку AutomaticMigrationDataLossAllowed = false по умолчанию и выполнит откат действия, если вы не запустите его с параметром -force .
или
источник