EF Міграція: відмінна остання застосована міграція?


435

Це виглядає як дійсно звичайне завдання, але я не можу знайти простий спосіб виконати це.

Я хочу скасувати останню застосовану міграцію. Я б очікував простої команди, як

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
Сумно, ми ось через рік, і ніхто насправді не читав питання.
Даніель ЗА

Відповіді:


160

Що стосується EF 5.0, то описаний вами підхід є кращим способом. Тому

PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

або використовуючи міграційні приклади

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

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


4
Ще одна деталь: Якщо у вас є ручна міграція, вам потрібно повернутись назад, але ви зрозуміли, що метод "Вниз" насправді не повертає речі належним чином, ви можете просто відредагувати та зберегти його, а потім повторно запустити оновлення бази даних -ціль. , поки вона не відкинеться належним чином. Змінення ручної міграції після факту - після того, як ви її вже застосували - не перетворює її на те, що не можна редагувати.
Кріс Москіні

1
Це не працює для мене. Все, що я отримую, - "визначеної міграції мішені" -1 "не існує.
tutiplain

2
@tutiplain Подивіться на його другий блок коду. Ви цитуєте те, що він хотів, існувало, а не те, що існує.
Сінджай

який правильний спосіб зробити це за допомогою команди dotnet? Вибачте, що не вдалося знайти в документації або я щось пропускаю. Спробували через entitframeworktutorial.net/efcore/… якісь пропозиції?
Sijan Shrestha

Я знайшов рішення, dotnet ef database update LastGoodMigrationоднак це здається заплутаним, оскільки я надходжу з фону вузла і використовую knex, послідовний, у них є команда повернути останню зміну, чи є якась команда повернути останню дію, застосовану до бази даних ?
Sijan Shrestha

415

Я хочу додати деякі пояснення до цієї теми:

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"

або

Update-Database -TargetMigration:2

Редагувати жовтень 2019:

Відповідно до цієї відповіді на аналогічне запитання, правильна команда є -Targetдля EF Core 1.1, тоді як -Migrationдля EF Core 2.0.


27
Назва міграції з індексом 0 є $InitialDatabase.
ПАМ'ЯТ

1
Дякую. Чи є значення $ (ім'я) для посилання на інші позиції індексу, такі як $ LatestDatabase, або щось подібне?
Язимов

Не знаю. Мені просто не вдалося знайти простого гуглінгу. Можливо, перегляд вихідного коду EF виявить їх?
ПАМ'ЯТ

3
FYI, ми просто зіткнулися з цим і хотіли зробити те ж саме, що і в ОП ... використовуючи ls variable:*це, схоже, $InitialDatabaseце просто змінна PowerShell, визначена як 0, немає інших визначених, навіть у поточному вихідному коді EF. І, міграція get нічого не повертає, вона записується лише на консоль, тому ви не можете перебирати повернені об’єкти ...
DrewJordan

1
Це повинна бути відповідь
WtFudgE

76

В EntityFrameworkCore :

Update-Database 20161012160749_AddedOrderToCourse

де 20161012160749_AddedOrderToCourseназва міграції, яку ви хочете відкатати.


3
GEM! Щоб знайти цю відповідь, мені знадобилося деякий час (оскільки вони змінили його на .NET Core). Однозначно варто заплатити за гроші!
ХокейJ

4
Вам не потрібно вказувати дату / час. Можна просто поставити ім’я.
Річард Марскелл - Дракір

1
Це не працює для мене ... воно скаже "Готово", але всі міграції після тієї, яку я вказав, все ще залишаються. І жоден код "Вниз" в жодній із цих міграцій не виконаний.
egmfrs

Ви також можете повернутися до певної міграції, такої: Update-Database -Migration: "AddedOrderToCourse" Особливо, коли використовуються пробіли в іменах міграції, так це зробити. (тобто Update-Database -Migration "Додано замовлення на курс")
SwissCoder

13

Рішення таке:

Update-Database TargetMigration 201609261919239_yourLastMigrationSucess

10
Про це вже сказано в питанні, запитуючий це вже знав. Я не бачу, як це допомагає, можливо, ви могли б зробити це зрозумілішим?
ANeves

ця відповідь більш коротка. TY Макс!
andreikashin

4

Додаткове нагадування:

Якщо у вас кілька типів конфігурації, вам потрібно вказати [ConfigurationName]

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

3

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

Консоль пропонує зробити це, якщо ваша міграція може спричинити втрату даних:

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


3
update-database 0

Попередження : Цескасує ВСІ міграції в EFCore! Будь ласка, використовуйте обережно :)


2

Я виявив, що це працює під час запуску в консолі диспетчера пакунків:

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

Ви можете створити сценарій, який полегшує роботу.


1

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

Update-Database 201207211340509_MyMigration -context myDBcontext

(де 201207211340509_MyMigrationє міграція, на яку ви хочете повернутись, і myDBcontextназва вашого контексту БД)



0

У випадку, якщо є можливість для втрати даних, EF не завершує команду оновлення бази даних, оскільки AutomaticMigrationDataLossAllowed = false за замовчуванням, і відкидає дію, якщо ви не запустите її з параметром -force .

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

або

Update-Database TargetMigration:Your_Migration_Index -force
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.