Эф миграций: откат последней примененной миграции?
похоже, это действительно распространенная задача, но я не могу найти простой способ сделать это.
Я хочу отменить последнюю примененную миграцию. Я ожидал бы простой команды, как
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-й миграции не существует до применения миграции!). Так что в этом в этом случае вы должны использовать значение 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
- это имя миграции, к которой требуется выполнить откат.
дополнительное напоминание:
Если у вас есть несколько типов конфигурации, вам нужно указать [Имя_конфигурации]
Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]
Я использую EntityFrameworkCore и я использую ответ @MaciejLisCK. Если у вас есть несколько контекстов БД, вам также нужно будет указать контекст, добавив параметр контекста, например:
Update-Database 201207211340509_MyMigration -context myDBcontext
(где
201207211340509_MyMigration
- это миграция, к которой вы хотите вернуться, иmyDBcontext
- это имя вашего контекста БД)
в EF Core можно ввести команду
Remove-Migration
в консоли диспетчера пакетов после добавления ошибочной миграции.консоль предлагает вам сделать это, если ваша миграция может приводить к потере данных:
была выполнена операция, которая может привести к потере данных. Пожалуйста, проверьте миграцию на точность. Чтобы отменить это действие, используйте Удалить-Миграция.