EF Migration: откат последней применяемой миграции?

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

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

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"

(По крайней мере, я могу использовать только имя, пропуская временную метку...)

Есть ли более простой способ?

Ответ 1

Как и в EF 5.0, подход, который вы описываете, является предпочтительным. Одним из решений было бы создать оболочку PS script, которая автоматизирует описанные выше шаги. Кроме того, не стесняйтесь создавать запрос функции для этого или, еще лучше, сделать снимок при его реализации! http://entityframework.codeplex.com/

Ответ 2

Я хочу добавить некоторые пояснения к этой теме:

Update-Database -TargetMigration:"name_of_migration"

То, что вы делаете выше, говорит, что вы хотите откатить все миграции до тех пор, пока у вас не останется указанная миграция. Таким образом, если вы используете GET -Migration S и обнаружите, что у вас есть A, B, C, D и E, то использование этой команды откатит E и D, чтобы перейти к C:

Update-Database -TargetMigration:"C"

Кроме того, если кто-то не может прокомментировать обратное, я заметил, что вы можете использовать порядковое значение и короткий переключатель -Target (таким образом, -Target совпадает с -Target Migration). Если вы хотите откатить все миграции и начать заново, вы можете использовать:

update-database -target:0

0, выше, приведет к откату даже ПЕРВОЙ миграции (это деструктивная команда - убедитесь, что вы знаете, что делаете, прежде чем ее использовать!) --something вы не сможете этого сделать, если используете приведенный выше синтаксис, требующий имени целевая миграция (имя 0-й миграции не существует до применения миграции!). Так что в этом случае вы должны использовать значение 0 (порядковый номер). Аналогично, если вы применили миграции A, B, C, D и E (в этом порядке), то порядковый номер 1 должен ссылаться на A, порядковый номер 2 должен ссылаться на B и так далее. Таким образом, для отката на B вы можете использовать либо:

Update-Database -TargetMigration:"B"

или же

Update-Database -TargetMigration:2

Изменить январь 2019 года:

Согласно этому связанному ответу на аналогичный вопрос, правильное имя параметра - -Target (для EF Core 1.1) или -Migration (для EF Core 2.0)

Ответ 3

В EntityFrameworkCore:

Update-Database 20161012160749_AddedOrderToCourse

где 20161012160749_AddedOrderToCourse - это имя миграции, к которому вы хотите откат.

Ответ 4

Решение:

Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess

Ответ 5

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

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

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

Ответ 6

update-database 0

This will roll back all migrations in EFCore

Ответ 7

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

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

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

Ответ 9

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

Update-Database 201207211340509_MyMigration -context myDBcontext

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