Як не застосовувати міграцію в ASP.NET Core з EF Core


179

Коли я запускаю PM> Remove-Migration -context BloggingContextVS2015 з проектом ASP.NET Core за допомогою EF Core, я отримую таку помилку:

System.InvalidOperationException: The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.    at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.RemoveMigration(String projectDir, String rootNamespace, Boolean force) 
    at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.RemoveMigration(String contextType, Boolean force) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsRemoveCommand.<>c__DisplayClass0_0.<Configure>b__0() 
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args) 
 The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.

Як я можу не застосувати це? Я використовую останню версію ASP.NET Core 1.0, EF Core та VS2015 Update 3.


3
спробуйте додати -forceв кінці
старатель

1
У статті learnnentityframeworkcore.com/migrations#reversing-a-migration описані кроки. Дякуємо @drewskis за посилання
Майкл Фрейджім

Дякуємо @MichaelFreidgeim
Drewskis

Відповіді:


215

Використання:

CLI

> dotnet ef database update <previous-migration-name>

Консоль менеджера пакунків

PM> Update-Database <previous-migration-name>

Приклад:

PM> Update-Database MyInitialMigration

Потім спробуйте видалити останню міграцію.

Видалення міграції без оновлення бази даних не працює, оскільки ви застосували зміни до бази даних.

Якщо ви використовуєте PMC, спробуйте: PM> update-database 0 Це видалить базу даних і дозволить видалити знімок міграції з вашого рішення


6
Я все одно отримую ту саму помилку. Я вперше використав, dotnet ef database update MyFirstMigration --context BloggingContextщо працював успішно. Тоді я побіг, dotnet ef migrations remove --context BloggingContextякий дав мені те саме повідомлення про помилку, як у моєму дописі
нам

14
Вам потрібно буде оновити міграцію раніше MyFirstMigration. Якщо це перша міграція (як випливає з назви), то ви можете використовувати dotnet ef database update 0для повернення (непридатності) всіх міграцій із бази даних. Тоді ви повинні мати можливість бігати dotnet ef migrations remove.
bvpb

Також варто зазначити, що вам слід використовувати лише ім’я міграції, виключаючи префікс дати
Structed

2
Телефонуйте dotnet ef migrations removeпісля цього
Chamika Sandamal

Ваше друге твердження: "Потім спробуйте видалити останню міграцію" не є повною у цій відповіді, будь ласка, скажіть, що саме ви маєте на увазі. видалити файл міграції? виконати команду? ...
С.Серпоошан

125

Щоб повністю видалити всі міграції та почати все заново, виконайте наступне:

dotnet ef database update 0
dotnet ef migrations remove

1
Але ви не хочете видаляти всі міграції. Наприклад, ви хочете зберегти міграцію за замовчуванням, яку створює VS для ідентичності (облікових записів користувачів) у папці Дані \ Міграції.
назв

Це добре знати dotnet ef database update 0, але запуск dotnet ef migrations removeпісля цього видалить міграцію за замовчуванням для Identity, що може бути не бажаним.
kimbaudi

Дякую за пораду dotnet ef database update 0! Я ніде цього не бачив ...
Tobias J

3
@nam "Але ви не хочете видаляти всі міграції." Але деякі з нас так і роблять. Не припускайте, що я хочу :)
starmandeluxe

3
Це не спрацювало для мене. У першому рядку було нормально і видалити всі міграції, на другому рядку я все одно потрапляюThe migration '20180618103514_InitialMigration' has already been applied to the database. Revert it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.
Ido Ran

52

Ви все одно можете використовувати Update-Databaseкоманду.

Update-Database -Migration <migration name> -Context <context name>

Однак, судячи з назви вашої міграції, я припускаю, що це перша міграція, тому команда може не працювати. Ви повинні мати змогу видалити запис із __MigrationHistoryтаблиці у вашій базі даних, а потім знову запустити Remove-Migrationкоманду. Ви також можете видалити файл міграції та просто запустити знову.


Ви можете зателефонувати Update-Databaseз консолі управління пакетами або зателефонувати dotnet ef database updateз командного рядка з каталогу проектів.
кімбауді

6
Просто для уточнення відповіді Бреда тут - <migration name>має бути назва міграції, до якої ви хочете повернутися (тобто, ймовірно, міграція до тієї, яку ви накрутили), а не назва міграції, яку ви хочете скасувати.
Марк Амерді

52

Щоб скасувати певну міграцію :

dotnet ef database update LastGoodMigrationName
or
PM> Update-Database -Migration LastGoodMigrationName

Щоб скасувати всі міграції :

dotnet ef database update 0
or
PM> Update-Database -Migration 0

Щоб видалити останню міграцію:

dotnet ef migrations remove
or
PM> Remove-Migration

Щоб видалити всі міграції:

просто видаліть Migrationsпапку.

Щоб видалити останні останні міграції (не всі):

Немає команди видалити купу міграцій, і ми не можемо просто видалити ці декілька migrationsта їх *.designer.csфайли, оскільки нам потрібно зберегти файл знімка у послідовному стані. Нам потрібно видалити міграції по черзі (див. To remove last migrationВище).

Щоб скасувати та видалити останню міграцію:

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force

Я продовжую бачити слово unapplyв цих публікаціях. Мене просто вдарило, що це не технічний термін, це словоun - apply
Гельцгейт

28

Для відновлення останньої застосованої міграції слід (команди консолі менеджера пакунків):

  1. Відновити міграцію з бази даних: PM> Update-Database <prior-migration-name>
  2. Видаліть файл міграції з проекту (або він буде повторно застосований на наступному кроці)
  3. Оновіть знімок моделі: PM> Remove-Migration

UPD : Другий крок, здається, не потрібен в останніх версіях Visual Studio (2017).


1
Дякую! Це прекрасно спрацювало Захоплюючи, що з усіх рішень ніхто ніколи не згадував про необхідність кроку 2.
Майкл Каргл

Так, ніхто не згадав крок другий. Дякую
Ахас Аджу

не впевнений у другому кроці, у моєму випадку (останній VS2017) міграційний файл буде видалено автоматично після виклику Remove-Migrationбез проблем. Я не впевнений, що ви сказали "це буде повторно застосовано на наступному кроці"!
S.Serpooshan

@ S.Serpooshan Дійсно. Я вручну видалив його, але коли я запустив Remove-Migration, він скаржився на те, що моя попередня міграція була застосована до бази даних. Але, це працює.
MetalMikester

Другий крок, який я думаю, є необхідним лише у випадку, коли ви зателефонуєте dbContext.Database.Migrate()у свій startup.cs
user3413723

23

Просто ви можете націлити міграцію за значенням

 Update-Database -Migration:0

Тоді йдіть і зніміть її

 Remove-Migration

1
Це працювало для мене, але я використовую EF та .NET core 2.0 з VS2017
Джеймс Моррісон,

2
Слідкуйте за: -міграція: 0 означає повернутися до держави без міграцій. Це очистить вашу базу даних
Кірен Джонстон,

Так, відповідно до поставленого запитання. Ви можете збільшити значення залежно від міграції, на яку ви хочете повернутись
Джон Нінгі

11

Щоб "не застосувати" найновішу (останню?) Міграцію після її застосування до бази даних:

  1. Відкрийте Провідник об’єктів SQL Server (Перегляд -> "Провідник об'єктів SQL Server")
  2. Перейдіть до бази даних, пов’язаної з вашим проектом, розгорнувши невеликі трикутники в бік.
  3. Розгорнути "Таблиці"
  4. Знайдіть таблицю з назвою "dbo._EFMigrationsHistory".
  5. Клацніть правою кнопкою миші та виберіть "Переглянути дані", щоб побачити записи таблиці у Visual Studio.
  6. Видаліть рядок, відповідний міграції, яку ви хочете не застосовувати (Скажіть "так" попередженням, якщо це буде запропоновано).
  7. У командному вікні каталогу, в якому є файл project.json, знову запустіть "dotnet ef migrations remove". Крім того, у консолі менеджера пакунків запустіть команду «Видалити-міграцію».

Сподіваюся, це допомагає та застосовно до будь-якої міграції в проекті ... Я перевірив це лише на останній міграції ...

Щасливого кодування!


21
Це фактично не скасує міграцію, просто змусьте рамки "подумати", що вона не застосовувалася. Якщо ви це зробите, ваша база даних буде в непослідовному стані.
mark.monteiro

Ручне редагування даних у вашій __EFMigrationsHistory - жахлива порада. Не робіть цього. Ця таблиця призначена лише для використання під інструментом міграції лише під кришкою. Якщо ви почнете редагувати дані вручну, одна помилка може створити всілякі шалені несподівані дії у вашому проекті. Набагато краща ідея використовувати одне з інших рекомендованих рішень.
Джо Ірбі

У нас виникла ситуація, коли молодший член команди плутався з перемиканням гілок і в результаті видаляв міграцію вручну з обох (хоча вона все ще була в таблиці __EFMigrationsHistory, оскільки вона вже застосовувалася), тому ми втратили "вниз". Це те, що ми в кінцевому підсумку мали зробити, а також кілька ручних перетворень у SSMS. Тож не робіть цього - якщо у вас зараз немає іншого вибору. Принаймні все, що він робив, було додати єдине нове поле.
Елла

10

У консолі диспетчера пакунків:

Update-Database Your_Migration_You_Want_To_Revert_To

Більше варіантів та пояснень щодо повернення міграцій можна переглянути тут


Корисне посилання, має бути коментар до питання
Майкл Фрейджім

Це те, що ви хочете використовувати в ядрі .NET
Зак,

10

Ви повинні видалити запис міграції '20160703192724_MyFirstMigration' із '_EFMigrationsHistory' таблиці.

інакше ця команда видалить міграцію та видалить папку міграцій:

   > remove-migration -force

7

Загалом, якщо ви використовуєте консоль диспетчера пакунків, правильним способом видалення певної міграції є посилання на ім’я міграції

Update-Database -Migration {Name of Migration} -Context {context}

Ще один спосіб видалення останньої міграції, яку ви застосували відповідно до документів, - за допомогою команди:

dotnet ef migrations remove

Ця команда повинна бути виконана з командного рядка розробника ( як відкрити командний рядок ) всередині вашого каталогу рішення.

Наприклад, якщо ваша програма має назву "Application" і знаходиться в папці c: \ Projects. Тоді ваш шлях повинен бути:

C:\Projects\Application

1
Питання було, що робити, якщо `dotnet ef migrations remove 'повертає помилку" Міграція вже застосована до бази даних "
Майкл Фрейджім

2

Для того, щоб не застосувати міграцію в EF Core 1.0, використовуйте команду:

оновлення бази даних dotnet ef {migra_name}

Використовуйте назву міграції, до якої ви хочете зберегти свої зміни. Список імен міграції можна знайти за допомогою:

dotnet ef список міграцій


2

Щоб відновити всі міграції, застосовані до БД, просто запустіть:

update-database 0

Після цього слід виконувати Remove-Migrationстільки разів, скільки файлів міграції відображаються в каталозі міграції. Команда видаляє останню міграцію, а також оновлює знімок.


1

спочатку запустіть таку команду:

PM>update-database -migration:0

а потім запустіть цей:

PM>remove_migration

Закінчити


0
var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
var roleManaget = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

await context.Database.EnsureDeletedAsync();

-1

1.Знайдіть таблицю "dbo._EFMigrationsHistory", потім видаліть запис міграції, який ви хочете видалити. 2. запустіть "delete-migration" в PM (Console Package Manager). Працює для мене.


Це призведе до невідповідності стану бази даних (наприклад, стовпець уже випав)
UNeverNo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.