So wenden Sie eine Migration in ASP.NET Core mit EF Core an

178

Wenn ich PM> Remove-Migration -context BloggingContextin VS2015 mit einem ASP.NET Core-Projekt unter Verwendung von EF Core ausgeführt werde, wird die folgende Fehlermeldung angezeigt:

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.

Wie kann ich es nicht anwenden? Ich verwende die neueste Version von ASP.NET Core 1.0, EF Core und VS2015 Update 3.

nam
quelle
3
versuchen Sie -forceam Ende hinzuzufügen
Prospektor
1
Der Artikel learnentityframeworkcore.com/migrations#reversing-a-migration beschreibt die Schritte. Danke @drewskis für den Link
Michael Freidgeim
Danke @MichaelFreidgeim
Drewskis

Antworten:

214

Verwenden:

CLI

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

Package Manager-Konsole

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

Beispiel:

PM> Update-Database MyInitialMigration

Versuchen Sie dann, die letzte Migration zu entfernen.

Das Entfernen der Migration ohne Datenbankaktualisierung funktioniert nicht, da Sie Änderungen an der Datenbank vorgenommen haben.

Wenn Sie PMC verwenden, versuchen Sie: PM> update-database 0 Dadurch wird die Datenbank gelöscht und Sie können den Migrations-Snapshot auf Ihrer Lösung entfernen

adem caglin
quelle
6
Ich erhalte immer noch den gleichen Fehler. Ich habe das zum ersten Mal dotnet ef database update MyFirstMigration --context BloggingContexterfolgreich genutzt. Dann lief ich dotnet ef migrations remove --context BloggingContextdas gab mir die gleiche Fehlermeldung wie in meinem Beitrag
nam
14
Sie müssen zuvor auf die Migration aktualisieren MyFirstMigration. Wenn dies die erste Migration ist (wie der Name schon sagt), können Sie dotnet ef database update 0alle Migrationen aus der Datenbank zurücksetzen (nicht anwenden). Sie sollten dann laufen können dotnet ef migrations remove.
bvpb
Es ist auch erwähnenswert, dass Sie nur den Namen der Migration verwenden sollten, mit Ausnahme des Datumspräfix
Strukturiert
2
Rufen Sie dotnet ef migrations removedanach an
Chamika Sandamal
Ihre zweite Aussage: "Dann versuchen Sie, die letzte Migration zu entfernen" ist in dieser Antwort nicht vollständig. Bitte sagen Sie genau, was Sie meinen. Migrationsdatei entfernen? Befehl ausführen? ...
S.Serpooshan
125

Gehen Sie wie folgt vor, um alle Migrationen vollständig zu entfernen und von vorne zu beginnen:

dotnet ef database update 0
dotnet ef migrations remove
Ronald Ramos
quelle
1
Sie möchten jedoch nicht alle Migrationen entfernen. Sie möchten beispielsweise die Standardmigration beibehalten, die VS für die Identität (Benutzerkonten) im Ordner "Daten \ Migrationen" erstellt.
Nam
Es ist gut zu wissen dotnet ef database update 0, aber wenn Sie dotnet ef migrations removedanach ausgeführt werden, wird die Standardmigration für Identität entfernt, die möglicherweise nicht erwünscht ist.
Kimbaudi
Danke für den Tipp dotnet ef database update 0! Ich hatte dies nirgends erwähnt gesehen ...
Tobias J
3
@nam "Aber Sie möchten nicht alle Migrationen entfernen." Aber einige von uns tun es. Nimm nicht an, was ich will :)
starmandeluxe
3
Das hat bei mir nicht funktioniert. Die erste Zeile war in Ordnung und alle Migrationen entfernen, in der zweiten Zeile bekomme ich nochThe 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

Sie können den Update-DatabaseBefehl weiterhin verwenden .

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

Nach dem Namen Ihrer Migration zu urteilen, gehe ich jedoch davon aus, dass es sich um die erste Migration handelt, sodass der Befehl möglicherweise nicht funktioniert. Sie sollten in der Lage sein, den Eintrag aus der __MigrationHistoryTabelle in Ihrer Datenbank zu löschen und den Remove-MigrationBefehl dann erneut auszuführen . Sie können die Migrationsdatei auch löschen und einfach erneut starten.

Brad
quelle
Sie können über die Update-DatabasePaketverwaltungskonsole oder dotnet ef database updateüber die Eingabeaufforderung aus dem Projektverzeichnis aufrufen .
Kimbaudi
6
Nur um Brad Antwort zu klären hier - <migration name>sollte der Name der Migration sein , Sie wollen zurück zu gehen (dh wahrscheinlich die Migration vor die, die Sie oben geschraubt), nicht der Name der Migration Sie rückgängig machen möchten.
Mark Amery
51

So wenden Sie eine bestimmte Migration (en) nicht an :

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

So wenden Sie alle Migrationen an :

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

So entfernen Sie die letzte Migration:

dotnet ef migrations remove
or
PM> Remove-Migration

So entfernen Sie alle Migrationen:

MigrationsOrdner einfach entfernen .

So entfernen Sie die letzten Migrationen (nicht alle):

Es gibt keinen Befehl zum Entfernen einer Reihe von Migrationen, und wir können diese wenigen migrationsund ihre *.designer.csDateien nicht einfach entfernen, da wir die Snapshot-Datei im konsistenten Zustand halten müssen. Wir müssen Migrationen einzeln entfernen (siehe To remove last migrationoben).

So entfernen Sie die letzte Migration und entfernen sie:

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force
AlbertK
quelle
Ich sehe das Wort unapplyimmer wieder in diesen Posts. Es hat mich nur getroffen, es ist kein Fachbegriff, es ist das Wortun - apply
Helzgate
28

Um die zuletzt angewendete Migration zurückzusetzen, sollten Sie (Paketmanager-Konsolenbefehle):

  1. Migration von Datenbank zurücksetzen: PM> Update-Database <prior-migration-name>
  2. Entfernen Sie die Migrationsdatei aus dem Projekt (oder sie wird im nächsten Schritt erneut angewendet).
  3. Modellschnappschuss aktualisieren: PM> Remove-Migration

UPD : Der zweite Schritt scheint in den neuesten Versionen von Visual Studio (2017) nicht erforderlich zu sein.

Dmitry Polomoshnov
quelle
1
Danke dir! Dies funktionierte perfekt. Fasziniert, dass von allen Lösungen niemand die Notwendigkeit von Schritt 2 erwähnte.
Michael Kargl
Yeh, niemand erwähnte den zweiten Schritt. Danke
Ajas Aju
Ich bin mir über den zweiten Schritt nicht sicher. In meinem Fall (letzter VS2017) wird die Migrationsdatei nach dem Aufruf Remove-Migrationohne Probleme automatisch gelöscht . Ich bin mir nicht sicher, was Sie gesagt haben "es wird im nächsten Schritt erneut angewendet"!
Serpooshan
@ S.Serpooshan In der Tat. Ich habe es manuell gelöscht, aber als ich Remove-Migration ausgeführt habe, hat es sich darüber beschwert, dass meine vorherige Migration auf die Datenbank angewendet wurde. Aber es funktioniert.
MetalMikester
Der zweite Schritt ist meiner Meinung nach nur notwendig, wenn Sie dbContext.Database.Migrate()Ihre startup.cs
user3413723 aufrufen
23

Sie können eine Migration einfach nach Wert ausrichten

 Update-Database -Migration:0

Dann fahren Sie fort und entfernen Sie es

 Remove-Migration
John Nyingi
quelle
1
Dies funktionierte für mich, aber ich verwende EF und .NET Core 2.0 mit VS2017
James Morrison
2
Achtung: -Migration: 0 bedeutet, dass Sie ohne Migrationen in den Staat zurückkehren. Dies wird Ihre Datenbank löschen
Kieren Johnstone
Ja entsprechend der gestellten Frage. Sie können den Wert abhängig von der Migration
erhöhen,
11

So "entfernen" Sie die letzte (letzte?) Migration, nachdem sie bereits auf die Datenbank angewendet wurde:

  1. Öffnen Sie den SQL Server-Objekt-Explorer (Ansicht -> "SQL Server-Objekt-Explorer")
  2. Navigieren Sie zu der Datenbank, die mit Ihrem Projekt verknüpft ist, indem Sie die kleinen Dreiecke zur Seite erweitern.
  3. Erweitern Sie "Tabellen"
  4. Suchen Sie die Tabelle mit dem Namen "dbo._EFMigrationsHistory".
  5. Klicken Sie mit der rechten Maustaste darauf und wählen Sie "Daten anzeigen", um die Tabelleneinträge in Visual Studio anzuzeigen.
  6. Löschen Sie die Zeile für Ihre Migration, die Sie nicht anwenden möchten (sagen Sie "Ja" zu der Warnung, wenn Sie dazu aufgefordert werden).
  7. Führen Sie im Befehlsfenster des Verzeichnisses mit der Datei project.json erneut "dotnet ef migrations remove" aus. Alternativ können Sie den Befehl "Remove-Migration" in der Paketmanagerkonsole ausführen.

Ich hoffe, dies hilft und gilt für jede Migration im Projekt ... Ich habe dies nur für die letzte Migration getestet ...

Viel Spaß beim Codieren!

Raj
quelle
21
Dadurch wird die Migration nicht aufgehoben, sondern das Framework muss "denken", dass es nicht angewendet wurde. In diesem Fall befindet sich Ihre Datenbank in einem inkonsistenten Zustand.
Mark.monteiro
Das manuelle Bearbeiten der Daten in Ihrer __EFMigrationsHistory ist ein schrecklicher Rat. Tu es nicht. Diese Tabelle darf nur von den Migrationstools unter der Haube verwendet werden. Wenn Sie mit der manuellen Bearbeitung der Daten beginnen, kann ein einzelner Fehler alle möglichen verrückten unerwarteten Verhaltensweisen in Ihrem Projekt hervorrufen. Es ist eine viel bessere Idee, eine der anderen empfohlenen Lösungen zu verwenden.
Joe Irby
Wir hatten eine Situation, in der ein Junior-Teammitglied mit dem Wechseln der Zweige verwechselt wurde und die Migration manuell aus beiden löschte (obwohl sie sich noch in der Tabelle __EFMigrationsHistory befand, da sie bereits angewendet wurde), sodass wir das "down" verloren haben. Dies mussten wir letztendlich tun, plus einige manuelle Umkehrungen in SSMS. Tun Sie es also nicht - es sei denn, Sie haben zu diesem Zeitpunkt keine andere Wahl. Zumindest fügte er nur ein neues Feld hinzu.
Ella
10

Sie sollten den Migrationsdatensatz '20160703192724_MyFirstMigration' aus der Tabelle '_EFMigrationsHistory' löschen .

Andernfalls entfernt dieser Befehl die Migration und löscht den Migrationsordner:

   > remove-migration -force
AminGolmahalle
quelle
7

Wenn Sie die Package Manager-Konsole verwenden, können Sie eine bestimmte Migration im Allgemeinen richtig entfernen, indem Sie auf den Namen der Migration verweisen

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

Eine andere Möglichkeit, die letzte Migration zu entfernen, die Sie gemäß den Dokumenten angewendet haben, ist die Verwendung des folgenden Befehls:

dotnet ef migrations remove

Dieser Befehl sollte an der Entwickler-Eingabeaufforderung ( Öffnen der Eingabeaufforderung ) in Ihrem Lösungsverzeichnis ausgeführt werden.

Zum Beispiel, wenn sich Ihre Anwendung im Namen "Anwendung" befindet und sich im Ordner c: \ Projects befindet. Dann sollte Ihr Weg sein:

C:\Projects\Application
Anastasios Selmanis
quelle
1
Die Frage war, was zu tun ist, wenn "dotnet ef migrations remove" den Fehler "Die Migration wurde bereits auf die Datenbank angewendet" zurückgibt
Michael Freidgeim
2

Verwenden Sie den folgenden Befehl, um eine Migration in EF Core 1.0 aufzuheben:

Aktualisierung der dotnet ef-Datenbank {Migrationsname}

Verwenden Sie den Migrationsnamen der Migration, bis zu dem Sie Ihre Änderungen beibehalten möchten. Die Liste der Namen der Migration finden Sie unter:

dotnet ef Migrationsliste

Rufus Lobo
quelle
2

Um alle Migrationen zurückzusetzen, die auf DB angewendet werden, führen Sie einfach Folgendes aus:

update-database 0

Anschließend sollte so Remove-Migrationoft ausgeführt werden, wie Migrationsdateien im Migrationsverzeichnis sichtbar sind. Der Befehl löscht die letzte Migration und aktualisiert auch den Snapshot.

Dipendu Paul
quelle
1

Führen Sie zunächst den folgenden Befehl aus:

PM>update-database -migration:0

und dann diesen ausführen:

PM>remove_migration

Fertig

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

await context.Database.EnsureDeletedAsync();
Kishor Gujar
quelle
-1

1.Finden Sie die Tabelle "dbo._EFMigrationsHistory" und löschen Sie den Migrationsdatensatz, den Sie entfernen möchten. 2. Führen Sie "Remove-Migration" in PM (Package Manager Console) aus. Funktioniert bei mir.

Atom
quelle
Dies führt zu einem inkonsistenten Status der Datenbank (z. B. wird eine Spalte bereits gelöscht)
UNeverNo