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"

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

Есть способ попроще?


person Cristian Diaconescu    schedule 10.08.2012    source источник
comment
К сожалению, мы здесь, спустя годы, и на самом деле никто не читал этот вопрос.   -  person Daniel ZA    schedule 18.03.2020


Ответы (15)


Начиная с EF 5.0, описанный вами подход является предпочтительным. Так

PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

или используя ваш пример миграции

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

Одним из решений может быть создание сценария PS-оболочки, который автоматизирует описанные выше шаги. Кроме того, не стесняйтесь создавать для этого запрос функции или, что еще лучше, попробовать реализовать это! https://github.com/dotnet/ef6

person Andrew Peters    schedule 13.08.2012
comment
Еще одна деталь: если у вас есть существующая ручная миграция, к которой вам нужно вернуться, но вы поняли, что ваш метод Down на самом деле не откатывает вещи должным образом, вы можете просто отредактировать и сохранить его, а затем повторно запустить update-database -target ... до тех пор, пока откатывается нормально. Изменение ручного переноса постфактум - после того, как вы уже применили его - не превращает его во что-то, что нельзя редактировать. - person Chris Moschini; 04.12.2013
comment
У меня это не работает. Все, что я получаю, это указанная целевая миграция -1 не существует. - person tutiplain; 06.08.2017
comment
@tutiplain Посмотрите на его второй блок кода. Вы цитируете то, что он желает, а не то, что существует. - person Sinjai; 22.06.2018
comment
как правильно это сделать с помощью команды dotnet? Извините, я не смог найти в документации или что-то упустил. Пробовал через entityframeworktutorial.net/efcore/ есть предложения? - person Sijan Shrestha; 23.05.2020
comment
Я нашел решение dotnet ef database update LastGoodMigration, однако это кажется запутанным, поскольку я исхожу из фона узла и использую knex, sequlize, у них есть команда для отмены последнего изменения, есть ли какая-либо команда для отмены последнего действия, которое было применено к база данных? - person Sijan Shrestha; 23.05.2020
comment
-TargetMigration не сработала, НО -Migration сработала, EF Core 5.0.7 - person Aaron. S; 10.06.2021

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

Update-Database -TargetMigration:"name_of_migration"

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

Update-Database -TargetMigration:"C"

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

Update-Database -Target:0

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

Update-Database -TargetMigration:"B"

or

Update-Database -TargetMigration:2

Редактировать октябрь 2019 г .:

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

person Jazimov    schedule 21.05.2014
comment
Имя миграции с индексом 0 - $InitialDatabase. - person MEMark; 09.09.2014
comment
Спасибо. Существуют ли какие-либо значения $ (name) для ссылки на другие позиции индекса, такие как $ LatestDatabase или что-то в этом роде? - person Jazimov; 10.09.2014
comment
Я не знаю. Я не смог найти ничего простым поиском в Google. Может быть, просмотр исходного кода EF обнаружит их? - person MEMark; 11.09.2014
comment
К вашему сведению, мы просто столкнулись с этим и хотели сделать то же самое, что и OP ... используя ls variable:*, похоже, что $InitialDatabase - это просто переменная PowerShell, определенная как 0, другие не определены, даже в текущем источнике EF код. И get-migrations ничего не возвращает, он только записывает в консоль, поэтому вы не можете перебирать возвращенные объекты ... - person DrewJordan; 23.10.2014
comment
Как вы обновляете класс модели, чтобы отразить возвращенную / вновь выполненную миграцию? - person Don Cheadle; 28.09.2015
comment
Этот ответ делает этот пост более ценным. Спасибо - person TyForHelpDude; 28.05.2017
comment
Короткий переключатель -Target может быть дополнительно сокращен до -t. Команды миграции представляют собой сценарии PowerShell. Переключатели сценария PowerShell можно сократить до минимального количества символов, необходимых для сохранения уникальности. - person Josh; 24.02.2018
comment
Это должен быть ответ - person WtFudgE; 18.09.2019

В EntityFrameworkCore:

Update-Database 20161012160749_AddedOrderToCourse

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

person MaciejLisCK    schedule 13.10.2016
comment
ДРАГОЦЕННЫЙ КАМЕНЬ! Мне потребовалось время, чтобы найти этот ответ (поскольку они изменили его на .NET Core). Определенно стоит проголосовать! - person HockeyJ; 28.10.2016
comment
Вам не нужно указывать дату / время. Вы можете просто указать имя. - person Richard Marskell - Drackir; 26.01.2018
comment
У меня это не сработает ... он скажет "Готово", но все миграции после указанного мной по-прежнему остаются. И ни один из кодов Down ни в одной из этих миграций не был выполнен. - person egmfrs; 21.03.2018
comment
можно также вернуться к определенной миграции, например: Update-Database -Migration: AddedOrderToCourse. Это способ сделать это особенно при использовании пробелов в именах миграции. (например, Обновление-База данных-Миграция добавлена ​​в курс) - person SwissCoder; 04.06.2018

Я понял, что нет хороших решений, использующих команду CLI dotnet, поэтому вот одно:

dotnet ef migrations list
dotnet ef database update NameOfYourMigration

Вместо NameOfYourMigration введите имя миграции, к которой вы хотите вернуться.

Затем вы можете навсегда удалить все отмененные миграции, используя

dotnet ef migrations remove
person QmlnR2F5    schedule 25.06.2020

Решение:

Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess
person Max    schedule 27.09.2016
comment
Об этом уже сказано в вопросе, спрашивающий уже знал об этом. Я не понимаю, как это помогает, может быть, вы могли бы пояснить? - person ANeves thinks SE is evil; 30.12.2016
comment
этот ответ более лаконичен. TY Max! - person andreikashin; 08.11.2018

EF CORE

PM> Update-Database yourMigrationName

(отменяет миграцию)

PM> Update-Database

работал на меня

в этом случае исходный вопрос (yourMigrationName = CategoryIdIsLong)

person feli_jane    schedule 04.11.2020
comment
Предыдущее решение не работает для EF Core, ошибка параметра, тогда как это двухэтапное решение работало, я смог удалить-миграцию после этого, тогда как до того, как я получил сообщение об ошибке: миграция '20210201060139_cascadeDelete' уже была применена к базе данных . Верните его и попробуйте еще раз. когда была предпринята попытка удалить-миграцию. - person David Jones; 01.02.2021

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

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

Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]
person Amos    schedule 18.05.2018

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

Консоль предлагает сделать это, если миграция может повлечь за собой потерю данных:

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

person Sean Saúl Astrakhan    schedule 06.08.2018
comment
Это работает только в том случае, если миграция еще не применена к базе данных. - person Pieter Meiresone; 11.01.2021

update-database 0

Предупреждение: это откатит ВСЕ миграции в EFCore! Пожалуйста, используйте осторожно :)

person mattylantz    schedule 16.04.2019

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

Update-Database 201207211340509_MyMigration -context myDBcontext

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

person Chris Halcrow    schedule 30.07.2018

Я обнаружил, что это работает при запуске в консоли диспетчера пакетов:

dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }

Вы можете создать сценарий, который упростит задачу.

person Alex Dresko    schedule 12.11.2019

Я запускаю свой через свою (BASH GIT) консоль, также работающую под управлением Entity Framework Core. Команды Update-Database не будут работать вне консоли пакета, и я должен использовать команды donet ef.

donet ef database update [Name of previous Migration]

Это запустит protected override void Down(MigrationBuilder migrationBuilder) метод вашей текущей миграции и всех остальных, чтобы вернуться к версии БД, которую вы установили.

Я также использую -p [migration project] -s [Project Solution]. Это также позволяет ему указывать на мои appsettings. [Enviorment] .json, где хранится мой пароль для доступа к БД.

export ASPNETCORE_ENVIRONMENT=[ENVIORMENT]; donet ef database update [Name of previous Migration] -p [Migration Project Name] -s [Solution Name]

Многое из этого может быть известно, но хотелось бы подробно рассказать, если вы делаете это впервые.

person LCarter    schedule 22.07.2020

Update-Database –TargetMigration:"Your migration name"

Для этой проблемы я предлагаю эту ссылку:

https://elegantcode.com/2012/04/12/entity-framework-migrations-tips/

person Mojtaba Nava    schedule 23.09.2019

В случае, если существует вероятность потери данных, EF не выполняет команду update-database, поскольку по умолчанию AutomaticMigrationDataLossAllowed = false, и отменяет действие, если вы не запустите его с параметром -force.

Update-Database –TargetMigration:"Your migration name" -force

or

Update-Database –TargetMigration:Your_Migration_Index -force
person hhk    schedule 01.11.2019

EF CORE

Обновить базу данных до предыдущей точки

update-database CategoryIdIsLong

А затем удалите плохую миграцию

remove-migration
person Gjaa    schedule 14.06.2021