EF Migrations: откат последней прикладной миграции?
похоже, это действительно распространенная задача, но я не могу найти простой способ сделать это.
Я хочу отменить последнюю примененную миграцию. Я ожидал простой команды, как
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"
(по крайней мере, я могу использовать только имя, минуя метку...)
есть ли более простой способ?
7 ответов
начиная с EF 5.0, подход, который вы описываете, является предпочтительным способом. Одним из решений было бы создание сценария PS-оболочки, который автоматизирует описанные выше шаги. Кроме того, не стесняйтесь создавать запрос функции для этого, или еще лучше, сделайте снимок на его реализацию! http://entityframework.codeplex.com/
Я хочу добавить некоторые пояснения к этой теме:
Update-Database -TargetMigration:"name_of_migration"
то, что вы делаете выше, говорит о том, что вы хотите откатить все миграции, пока вы не останетесь с указанной миграцией. Таким образом, если вы используете GET-MIGRATIONS и обнаружите, что у вас есть A, B, C, D и E, то с помощью этой команды откат E и D приведет вас к C:
Update-Database -TargetMigration:"C"
кроме того, если никто не может прокомментировать обратное, я заметил, что вы можете использовать порядковое значение и короткую цель переключатель (таким образом,- Target совпадает с-TargetMigration). Если вы хотите откатить все миграции и начать все заново, вы можете использовать:
update-database -target:0
0, выше, откатит даже первую миграцию (это разрушительная команда--убедитесь, что вы знаете, что вы делаете, прежде чем использовать его!)--то, что вы не можете сделать, если используете синтаксис выше, который требует имени целевой миграции (имя 0-й миграции не существует до применения миграции!). Так что в этом case, вы должны использовать значение 0 (порядковый номер). Аналогично, если вы применили миграции A, B, C, D и E (в этом порядке), то порядковый номер 1 должен относиться к A, порядковый номер 2 должен относиться к B и т. д. Так что откатить до B можно использовать:
Update-Database -TargetMigration:"B"
или
Update-Database -TargetMigration:2
на EntityFrameworkCore:
Update-Database 20161012160749_AddedOrderToCourse
здесь 20161012160749_AddedOrderToCourse
имя миграции вы хотите отката.
дополнительное напоминание:
Если у вас есть несколько типов конфигурации, вам нужно указать [ConfigurationName]
Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]
Я использую EntityFrameworkCore и я использую ответ @MaciejLisCK. Если у вас несколько контекстов БД, вам также нужно будет указать контекст, добавив параметр контекста, например:
Update-Database 201207211340509_MyMigration -context myDBcontext
(где 201207211340509_MyMigration
- это миграция, к которой вы хотите вернуться, и myDBcontext
- это имя вашего контекста БД)
в EF Core вы можете ввести команду Remove-Migration
в консоли диспетчера пакетов после добавления ошибочной миграции.
консоль предлагает вам сделать это, если ваша миграция может приводить к потере данных:
была проведена операция, которая может привести к потере данных. Пожалуйста, просмотрите миграцию для точности. Чтобы отменить это действие, используйте Удалить-Миграция.