Jak cofnąć zastosowanie migracji w ASP.NET Core z EF Core


179

Gdy uruchamiam PM> Remove-Migration -context BloggingContextw VS2015 z projektem ASP.NET Core przy użyciu EF Core, otrzymuję następujący błąd:

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.

Jak mogę go odrzucić? Używam najnowszej wersji ASP.NET Core 1.0, EF Core i VS2015 Update 3.


3
spróbuj dodać -forcena koniec
poszukiwacz


Dzięki @MichaelFreidgeim
Drewskis

Odpowiedzi:


215

Posługiwać się:

CLI

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

Konsola menedżera pakietów

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

Przykład:

PM> Update-Database MyInitialMigration

Następnie spróbuj usunąć ostatnią migrację.

Usunięcie migracji bez aktualizacji bazy danych nie działa, ponieważ zastosowano zmiany w bazie danych.

Jeśli używasz PMC, spróbuj: PM> update-database 0 Spowoduje to wyczyszczenie bazy danych i umożliwi usunięcie migawki migracji z rozwiązania


6
Nadal otrzymuję ten sam błąd. Po raz pierwszy użyłem dotnet ef database update MyFirstMigration --context BloggingContexttego, który działał pomyślnie. Następnie uruchomiłem, dotnet ef migrations remove --context BloggingContextktóry dał mi ten sam komunikat o błędzie, co w moim poście
nam

14
Wcześniej musisz zaktualizować migrację MyFirstMigration. Jeśli jest to pierwsza migracja (jak sama nazwa wskazuje), możesz użyć dotnet ef database update 0do cofnięcia (cofnięcia) wszystkich migracji z bazy danych. Powinieneś być wtedy w stanie biegać dotnet ef migrations remove.
bvpb

Warto również zauważyć, że powinieneś używać tylko nazwy migracji, z wyłączeniem prefiksu daty
Structed

2
Zadzwoń dotnet ef migrations removepo tym
Chamika Sandamal

Twoje drugie stwierdzenie: „W takim razie spróbuj usunąć ostatnią migrację” nie jest kompletne w tej odpowiedzi, powiedz dokładnie, co masz na myśli. usunąć plik migracji? wykonać polecenie? ...
S.Serpooshan,

125

Aby całkowicie usunąć wszystkie migracje i zacząć od nowa, wykonaj następujące czynności:

dotnet ef database update 0
dotnet ef migrations remove

1
Ale nie chcesz usuwać wszystkich migracji. Na przykład chcesz zachować domyślną migrację, którą program VS tworzy dla tożsamości (kont użytkowników) w folderze Data \ Migrations.
nam

Warto wiedzieć dotnet ef database update 0, ale uruchomienie dotnet ef migrations removepóźniej spowoduje usunięcie domyślnej migracji tożsamości, co może nie być pożądane.
kimbaudi

Dzięki za wskazówkę dotnet ef database update 0! Nigdzie nie widziałem tego wspomnianego ...
Tobias J

3
@nam „Ale nie chcesz usuwać wszystkich migracji”. Ale niektórzy z nas to robią. Nie zakładaj, czego chcę :)
starmandeluxe

3
To nie zadziałało dla mnie. Pierwsza linia była ok i usunęła wszystkie migracje, na drugiej nadal dostaję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

Nadal możesz użyć Update-Databasepolecenia.

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

Jednak sądząc po nazwie twojej migracji, zakładam, że jest to pierwsza migracja, więc to polecenie może nie działać. Powinieneś móc usunąć wpis z __MigrationHistorytabeli w bazie danych, a następnie Remove-Migrationponownie uruchomić komendę. Możesz także usunąć plik migracji i zacząć od nowa.


Możesz wywołać Update-Databasez konsoli zarządzania pakietami lub dotnet ef database updatez wiersza polecenia z katalogu projektu.
kimbaudi

6
Żeby wyjaśnić tutaj odpowiedź Brada - <migration name>powinna to być nazwa migracji, do której chcesz wrócić (tj. Prawdopodobnie migracja przed tą, którą schrzaniłeś), a nie nazwa migracji, którą chcesz cofnąć.
Mark Amery

52

Aby cofnąć zastosowanie określonej migracji :

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

Aby cofnąć wszystkie migracje :

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

Aby usunąć ostatnią migrację:

dotnet ef migrations remove
or
PM> Remove-Migration

Aby usunąć wszystkie migracje:

po prostu usuń Migrationsfolder.

Aby usunąć kilka ostatnich migracji (nie wszystkie):

Nie ma polecenia, aby usunąć kilka migracji i nie możemy po prostu usunąć tych kilku migrationsi ich *.designer.csplików, ponieważ musimy utrzymać plik migawki w spójnym stanie. Musimy usuwać migracje pojedynczo (patrz To remove last migrationwyżej).

Aby wycofać wniosek i usunąć ostatnią migrację:

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

Ciągle widzę to słowo we unapplywszystkich tych postach. Po prostu dotarło do mnie, że to nie jest termin techniczny, to słowoun - apply
Helzgate

28

Aby cofnąć ostatnią zastosowaną migrację, należy (polecenia konsoli menedżera pakietów):

  1. Przywróć migrację z bazy danych: PM> Update-Database <prior-migration-name>
  2. Usuń plik migracji z projektu (lub zostanie ponownie zastosowany w następnym kroku)
  3. Zaktualizuj migawkę modelu: PM> Remove-Migration

UPD : Drugi krok wydaje się nie być wymagany w najnowszych wersjach programu Visual Studio (2017).


1
Dziękuję Ci! To zadziałało doskonale. Zafascynowany, że spośród wszystkich rozwiązań nikt nigdy nie wspomniał o potrzebie kroku 2.
Michael Kargl

Tak, nikt nie wspomniał o kroku drugim. Dziękuję
Ajas Aju

nie jestem pewien co do drugiego kroku, w moim przypadku (najnowszy VS2017) plik migracji zostanie automatycznie usunięty po wywołaniu Remove-Migrationbez problemu. Nie jestem pewien, co powiedziałeś „zostanie ponownie zastosowane w następnym kroku”!
S.Serpooshan,

@ S.Serpooshan Rzeczywiście. Usunąłem go ręcznie, ale kiedy uruchomiłem Remove-Migration, narzekał, że moja poprzednia migracja została zastosowana do bazy danych. Ale to działa.
MetalMikester

Myślę, że drugi krok jest konieczny tylko wtedy, gdy zadzwonisz dbContext.Database.Migrate()do swojego startup.cs
user3413723

23

Po prostu możesz kierować migrację według wartości

 Update-Database -Migration:0

Następnie idź dalej i usuń go

 Remove-Migration

1
To zadziałało dla mnie, ale używam EF i .NET core 2.0 z VS2017
James Morrison,

2
Uwaga: -Migracja: 0 oznacza powrót do stanu bez migracji. Spowoduje to wyczyszczenie bazy danych
Kieren Johnstone,

Tak, zgodnie z zadanym pytaniem. Możesz zwiększyć wartość w zależności od migracji, do której chcesz cofnąć
John Nyingi

11

Aby „cofnąć zastosowanie” ostatniej (najnowszej?) Migracji po jej zastosowaniu w bazie danych:

  1. Otwórz Eksplorator obiektów SQL Server (Widok -> „Eksplorator obiektów SQL Server”)
  2. Przejdź do bazy danych połączonej z projektem, rozszerzając małe trójkąty na bok.
  3. Rozwiń „Tabele”
  4. Znajdź tabelę o nazwie „dbo._EFMigrationsHistory”.
  5. Kliknij go prawym przyciskiem myszy i wybierz „Wyświetl dane”, aby wyświetlić wpisy tabeli w programie Visual Studio.
  6. Usuń wiersz odpowiadający migracji, której chcesz cofnąć (powiedz „tak” ostrzeżeniu, jeśli zostanie wyświetlony monit).
  7. Uruchom ponownie polecenie „dotnet ef migrations remove” w oknie poleceń w katalogu zawierającym plik project.json. Alternatywnie uruchom polecenie „Remove-Migration” w konsoli menedżera pakietów.

Mam nadzieję, że to pomoże i ma zastosowanie do każdej migracji w projekcie ... Przetestowałem to tylko dla najnowszej migracji ...

Miłego kodowania!


21
Nie spowoduje to cofnięcia migracji, a jedynie sprawi, że struktura „pomyśli”, że nie została zastosowana. Twoja baza danych będzie w niespójnym stanie, jeśli to zrobisz.
mark.monteiro

Ręczne edytowanie danych w Twojej __EFMigrationsHistory to straszna rada. Nie rób tego. Ta tabela ma być używana tylko pod maską przez narzędzia migracji. Jeśli zaczniesz ręcznie edytować dane, jeden błąd może spowodować różnego rodzaju szalone nieoczekiwane zachowanie w projekcie. O wiele lepszym pomysłem jest skorzystanie z jednego z pozostałych rekomendowanych rozwiązań.
Joe Irby

Mieliśmy sytuację, w której młodszy członek zespołu pomylił się z przełączaniem gałęzi i skończyło się na ręcznym usunięciu migracji z obu (chociaż nadal znajdowała się ona w tabeli __EFMigrationsHistory, ponieważ została już zastosowana), więc straciliśmy „dół”. To właśnie musieliśmy zrobić, a także kilka ręcznych zmian w SSMS. Więc nie rób tego - chyba że w tym momencie nie masz innego wyboru. Przynajmniej dodał tylko jedno nowe pole.
Ella


10

Należy usunąć rekord migracji „20160703192724_MyFirstMigration” z „_EFMigrationsHistory” tabeli .

w przeciwnym razie to polecenie usunie migrację i usunie folder migracji:

   > remove-migration -force

7

Ogólnie rzecz biorąc, jeśli używasz konsoli menedżera pakietów, właściwym sposobem usunięcia określonej migracji jest odwołanie się do nazwy migracji

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

Innym sposobem usunięcia ostatniej migracji, którą zastosowałeś zgodnie z dokumentami, jest użycie polecenia:

dotnet ef migrations remove

To polecenie należy wykonać z wiersza polecenia programisty ( jak otworzyć wiersz polecenia ) w katalogu rozwiązania.

Na przykład, jeśli Twoja aplikacja ma nazwę „Aplikacja” i znajduje się w folderze c: \ Projekty. Twoja ścieżka powinna więc wyglądać następująco:

C:\Projects\Application

1
Pytanie brzmiało, co zrobić, jeśli „dotnet ef migrations remove” zwraca błąd „Migracja została już zastosowana do bazy danych”
Michael Freidgeim

2

Aby cofnąć zastosowanie migracji w EF Core 1.0, użyj polecenia:

aktualizacja bazy danych dotnet ef {migracja_name}

Użyj nazwy migracji, do której chcesz zachować zmiany. Listę nazw migracji można znaleźć za pomocą:

Lista migracji dotnet ef


2

Aby cofnąć wszystkie migracje zastosowane do DB, po prostu uruchom:

update-database 0

Następnie należy uruchomić Remove-Migrationtyle razy, ile plików migracji jest widocznych w katalogu Migration. Polecenie usuwa najnowszą migrację, a także aktualizuje migawkę.


1

najpierw uruchom następujące polecenie:

PM>update-database -migration:0

a następnie uruchom ten:

PM>remove_migration

koniec


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

await context.Database.EnsureDeletedAsync();

-1

1. znajdź tabelę „dbo._EFMigrationsHistory”, a następnie usuń rekord migracji, który chcesz usunąć. 2. uruchom „usuń-migrację” w PM (konsoli menedżera pakietów). Pracuje dla mnie.


Doprowadzi to do niespójnego stanu bazy danych (np. Kolumna została już usunięta)
UNeverNo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.