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.

nam
źródło
3
spróbuj dodać -forcena koniec
poszukiwacz
1
W artykule learnentityframeworkcore.com/migrations#reversing-a-migration opisano kroki. Dzięki @drewskis za link
Michael Freidgeim
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

adem caglin
źródło
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
Ronald Ramos
źródło
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.

Ćwiek
źródło
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
AlbertK
źródło
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).

Dmitry Polomoshnov
źródło
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
John Nyingi
źródło
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!

Raj
źródło
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
AminGolmahalle
źródło
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
Anastasios Selmanis
źródło
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

Rufus Lobo
źródło
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ę.

Dipendu Paul
źródło
1

najpierw uruchom następujące polecenie:

PM>update-database -migration:0

a następnie uruchom ten:

PM>remove_migration

koniec

Abbas Hadavandi
źródło
0
var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
var roleManaget = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

await context.Database.EnsureDeletedAsync();
Kishor Gujar
źródło
-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.

Atom
źródło
Doprowadzi to do niespójnego stanu bazy danych (np. Kolumna została już usunięta)
UNeverNo