Эф миграций: откат последней примененной миграции?


похоже, это действительно распространенная задача, но я не могу найти простой способ сделать это.

Я хочу отменить последнюю примененную миграцию. Я ожидал бы простой команды, как

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 346

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 –TargetMigration 201609261919239_yourLastMigrationSucess

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

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

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

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

Update-Database 201207211340509_MyMigration -context myDBcontext

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

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

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

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