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 имя миграции вы хотите отката.


решение:

Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess

дополнительное напоминание:

Если у вас есть несколько типов конфигурации, вам нужно указать [ConfigurationName]

Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]

Я использую EntityFrameworkCore и я использую ответ @MaciejLisCK. Если у вас несколько контекстов БД, вам также нужно будет указать контекст, добавив параметр контекста, например:

Update-Database 201207211340509_MyMigration -context myDBcontext

(где 201207211340509_MyMigration - это миграция, к которой вы хотите вернуться, и myDBcontext - это имя вашего контекста БД)


в EF Core вы можете ввести команду Remove-Migration в консоли диспетчера пакетов после добавления ошибочной миграции.

консоль предлагает вам сделать это, если ваша миграция может приводить к потере данных:

была проведена операция, которая может привести к потере данных. Пожалуйста, просмотрите миграцию для точности. Чтобы отменить это действие, используйте Удалить-Миграция.