Как отменить миграцию в ASP.NET Core с EF Core


180

При запуске PM> Remove-Migration -context BloggingContextв VS2015 с проектом 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
В статье learnentityframeworkcore.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

Также стоит отметить, что вы должны использовать только имя миграции, исключая префикс даты
Struct

2
Позвоните dotnet ef migrations removeпосле этого
Chamika Sandamal

Ваше второе утверждение: «Тогда попробуйте удалить последнюю миграцию» не является полным в этом ответе, пожалуйста, скажите точно, что вы имеете в виду. удалить файл миграции? выполнить команду? ...
С.Серпушан

125

Чтобы полностью удалить все миграции и начать все сначала, сделайте следующее:

dotnet ef database update 0
dotnet ef migrations remove

1
Но вы не хотите удалять все миграции. Например, вы хотите сохранить стандартную миграцию VS, созданную для идентификации (учетные записи пользователей) в папке Data \ Migrations.
Нам

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

Спасибо за совет dotnet ef database update 0! Я не видел нигде упомянутого ...
Тобиас J

3
@nam "Но вы не хотите удалять все миграции." Но некоторые из нас делают. Не
думай,

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из командной строки из каталога проекта.
Кимбауди

7
Просто чтобы прояснить ответ Брэда - это <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.
Майкл Каргл,

Да, никто не упомянул второй шаг. Спасибо
Ajas Aju

не уверен насчет второго шага, в моем случае (последний VS2017) файл миграции будет удален автоматически после вызова Remove-Migrationбез проблем. Я не уверен в том, что вы сказали "это будет снова применено на следующем шаге"!
С.Серпушан

@ 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 означает вернуться в состояние без миграций. Это очистит вашу базу данных
Kieren Johnstone

Да, в соответствии с заданным вопросом. Вы можете увеличивать значение в зависимости от того,
какую

11

Чтобы «отменить» самую (последнюю?) Миграцию после того, как она уже была применена к базе данных:

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

Надеюсь, это поможет и применимо к любой миграции в проекте ... Я проверил это только для самой последней миграции ...

Удачного кодирования!


21
Это на самом деле не отменяет миграцию, просто заставляет структуру «думать», что она не была применена. Ваша база данных будет в несогласованном состоянии, если вы сделаете это.
mark.monteiro

Редактирование данных в вашей __EFMigrationsHistory вручную - ужасный совет. Не делай этого. Эта таблица предназначена для использования только внутренними инструментами миграции. Если вы начнете редактировать данные вручную, единственная ошибка может привести к неожиданным неожиданным действиям в вашем проекте. Намного лучше использовать одно из других рекомендуемых решений.
Джо Ирби

У нас была ситуация, когда младший член команды путался с переключением ветвей и в итоге удалял миграцию вручную из обеих (хотя она все еще была в таблице __EFMigrationsHistory, так как она уже была применена), поэтому мы потеряли «down». Это то, что нам пришлось сделать, плюс некоторые ручные изменения в 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

Эта команда должна быть выполнена из командной строки разработчика ( как открыть командную строку ) внутри вашего каталога решений.

Например, если ваше приложение находится внутри имени «Приложение» и находится в папке c: \ Projects. Тогда ваш путь должен быть:

C:\Projects\Application

1
Вопрос был в том, что делать, если «dotnet ef migrations remove» возвращает ошибку «Миграция уже применена к базе данных»
Майкл Фрейдгейм,

2

Чтобы отменить миграцию в EF Core 1.0, используйте команду:

dotnet ef обновление базы данных {имя_ миграции}

Используйте имя миграции, до которого вы хотите сохранить изменения. Список имен миграции можно найти с помощью:

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


2

Чтобы отменить все миграции, которые применяются к БД, просто запустите:

update-database 0

Следует выполнить 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. запустить «удаление-миграцию» в PM (Консоль диспетчера пакетов). Работает для меня.


Это приведет к несовместимому состоянию базы данных (например, столбец уже
удален
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.