Entity-Framework-Migrationen zurücksetzen

299

Ich habe meine Migrationen durcheinander gebracht, die ich bei IgnoreChangesder anfänglichen Migration verwendet habe, aber jetzt möchte ich alle meine Migrationen löschen und mit einer anfänglichen Migration mit der gesamten Logik beginnen.

Wenn ich die Migrationen im Ordner lösche und versuche Add-Migration, keine vollständige Datei zu generieren (sie ist leer, da ich seit meiner letzten, aber jetzt gelöschten Migration keine Änderungen vorgenommen habe).

Gibt es einen Befehl zum Deaktivieren von Migrationen , damit ich ihn erneut ausführen kann Enable-Migrations?

Todd
quelle
1
Siehe auch
sshow
3
Ein wichtiger Hinweis, wenn Sie mehrere Verbindungszeichenfolgen haben: Geben Sie an, welche beim Zurücksetzen der Migrationen verwendet werden sollen. Andernfalls wird versucht, diese auf beide anzuwenden, was bei Unstimmigkeiten zu Problemen führen kann.
Jeroen Vannevel
Hinweis: Wenn Sie Ihre Migrationen nicht gelöscht haben (Sie verwenden die Versionskontrolle, oder?), Könnten Sie Ihre Datenbank aktualisieren - auf Ihre erste Migration, dann die Schadensbegrenzung löschen und ab diesem Zeitpunkt neue Migrationen erstellen. Siehe hier: stackoverflow.com/a/23793384/309634
DarcyThomas

Antworten:

446

Du brauchst :

  1. Status löschen: Löschen Sie den Migrationsordner in Ihrem Projekt. Und
  2. Löschen Sie die __MigrationHistoryTabelle in Ihrer Datenbank (möglicherweise unter Systemtabellen). Dann
  3. Führen Sie den folgenden Befehl in der Package Manager-Konsole aus:

    Enable-Migrations -EnableAutomaticMigrations -Force

    Mit oder ohne verwenden -EnableAutomaticMigrations

  4. Und schließlich können Sie laufen:

    Add-Migration Initial
Todd
quelle
5
^^ Ich habe es herausgefunden - es war ein TFS-Fehler - wenn Sie TFS verwenden, müssen Sie einchecken, bevor Sie den Befehl "Enable-Migrations ..." ausführen. : D
BrainSlugs83
7
Wenn Sie keine Versionskontrolle verwenden, speichern Sie Ihre Seed-Werte, bevor Sie sie löschen!
RyanJMcGowan
77
@RyanJMcGowan Wenn Sie keine Versionskontrolle verwenden, haben Sie es verdient, Ihre Arbeit zu verlieren. :-)
Mike Cole
4
@ Gut. +1 dazu. Hat mir viel Zeit gespart. Wenn nur das EF-Team all das in einen Befehl zum Zurücksetzen von Migrationen integrieren könnte. Vielleicht EF 6 ...
Gerald Davis
24
Für eine vorhandene Datenbank müssen Sie den Inhalt der Funktion "Up" auskommentieren. Andernfalls erhalten Sie eine Fehlermeldung, wenn Sie "Update-Database" ausführen. Es würde sich beschweren, dass die Tabelle bereits vorhanden ist
Guy
149

Das Problem: Sie haben Ihre Migrationen durcheinander gebracht und möchten sie zurücksetzen, ohne Ihre vorhandenen Tabellen zu löschen.

Das Problem: Sie können Migrationen mit vorhandenen Tabellen in der Datenbank nicht zurücksetzen, da EF die Tabellen von Grund auf neu erstellen möchte.

Was ist zu tun:

  1. Löschen Sie vorhandene Migrationen aus der Tabelle Migrations_History.

  2. Löschen Sie vorhandene Migrationen aus dem Migrationsordner.

  3. Führen Sie Add-Migration Reset aus. Dadurch wird eine Migration in Ihrem Migrationsordner erstellt, die das Erstellen der Tabellen umfasst (diese wird jedoch nicht ausgeführt, sodass keine Fehler auftreten.)

  4. Sie müssen jetzt die erste Zeile in der MigrationHistory-Tabelle erstellen, damit EF eine Momentaufnahme des aktuellen Status hat. EF wird dies tun, wenn Sie eine Migration anwenden. Sie können die soeben durchgeführte Migration jedoch nicht anwenden, da die Tabellen bereits in Ihrer Datenbank vorhanden sind. Gehen Sie also in die Migration und kommentieren Sie den gesamten Code in der "Up" -Methode aus.

  5. Führen Sie nun die Update-Datenbank aus. Es wird die Migration anwenden (ohne die Datenbank tatsächlich zu ändern) und eine Snapshot-Zeile in MigrationHistory erstellen.

Sie haben jetzt Ihre Migrationen zurückgesetzt und können mit normalen Migrationen fortfahren.

Greg Gum
quelle
11
Dies ist die einzige Antwort, die für mich funktioniert hat. Die akzeptierte Antwort scheint nicht das Problem zu lösen, was passiert, wenn Sie Update-Database oder Ihre Anwendung ausführen (abhängig davon, welche Art von Initialisierer Sie verwenden). Es wird versucht, die Migration auszuführen und bereits vorhandene Änderungen vorzunehmen. Es sei denn, ich vermisse etwas.
Regularmike
2
Es ist auch die Antwort, die flexibler ist. In meinem Fall gab es einige Änderungen, die ich anwenden musste, andere nicht. Ich könnte das nützliche Zeug einfach in meinem Up () behalten.
Tec-Goblin
1
@ H.Johnson, ich habe es angeschaut. Hattest du eine Frage dazu?
Greg Gum
2
Beachten Sie, dass die Tabelle _MigrationsHistory ab EF 6.0 Migrationen für mehrere DBContexts enthält. Das Löschen kann zu Problemen führen. Sie sollten nur die Zeilen löschen, in denen ContextKey = Ihr Migrationsname ist. Auch nach 2 oben musste ich wieder Migrationen aktivieren
David Waterworth
2
Im Wesentlichen die gleiche Antwort mit einem erweiterten Beispiel (mit Screenshots): weblog.west-wind.com/posts/2016/Jan/13/…
nmit026
30

Wie wäre es mit

Update-Database TargetMigration: $InitialDatabase

in der Package Manager-Konsole? Es sollte alle Aktualisierungen auf seinen sehr frühen Zustand zurücksetzen.

Referenzlink: Code First Migrations - Migration auf eine bestimmte Version (einschließlich Downgrade)

Chris Voon
quelle
Ich glaube, meine größte Frustration bestand darin, Migrationen nicht mehr zu vertrauen, um den Zustand genau aufrechtzuerhalten. Und deshalb von vorne anfangen wollen.
Todd
@Todd, ich bin mitgestolpert und es war nicht immer klar, ob ich die Migrationsdateien löschen sollte, um von vorne zu beginnen. Jetzt funktioniert es wie folgt: 1. Mit dem Befehl "Update-Database –TargetMigration: $ InitialDatabase" auf initial zurücksetzen. 2. Entfernen Sie alle Migrationsdateien (benannt mit yyyyMMddHHmmssx_Name.cs oder .vb). 3. Aktualisieren Sie das Update mit 'add-Migration -Name some_name'. 4. Geben Sie das Update mit 'update-Database' aus, um Ihre Datenbank zu beeinflussen. Hoffe es funktioniert bei dir.
Chris Voon
In meinem Fall führte der in dieser Antwort vorgeschlagene Befehl zu SQL-Fehlern.
Justin Skiles
Was soll es bedeuten "InitialDatabase"? löscht es die Tabellen oder Spalten, die bereits in der Datenbank erstellt wurden?
Serge
16

Um dies zu beheben, müssen Sie:

  1. Löschen Sie alle * .cs-Dateien im Migrationsordner.

  2. Löschen Sie die _MigrationHistory-Tabelle in der Datenbank

  3. Lauf Enable-Migrations -EnableAutomaticMigrations -Force

  4. Lauf Add-Migration Reset

Dann müssen Sie in der public partial class Reset : DbMigrationKlasse alle vorhandenen und aktuellen Tabellen kommentieren:

public override void Up()
{
// CreateTable(
// "dbo.<EXISTING TABLE NAME IN DATABASE>
// ...
// }
...
}

Wenn Sie dieses Bit verpassen, wird alles fehlschlagen und Sie müssen erneut beginnen!

  1. Jetzt laufen Update-Database -verbose

Dies sollte erfolgreich sein, wenn Sie die obigen Schritte korrekt ausgeführt haben, und jetzt können Sie wie gewohnt weitermachen.

rostiger Nagel
quelle
2
Anstatt alles zu kommentieren, können Sie auch einfach "return" schreiben. in der ersten Zeile der Methode Up ().
Kettentreppe
6

Da dies immer noch angezeigt wird, wenn wir in .NET Core nach EF suchen, werde ich meine Antwort hier veröffentlichen (da es mich sehr verfolgt hat). Beachten Sie, dass die EF 6 .NET-Version einige Feinheiten aufweist (kein anfänglicher Befehl, und Sie müssen "Snapshot" -Dateien löschen).

(Getestet in .NET Core 2.1)

Hier sind die Schritte:

  1. Löschen Sie die _efmigrationhistoryTabelle.
  2. Suchen Sie nach Ihrer gesamten Lösung nach Dateien, deren Name Snapshot enthält , z. B. ApplicationDbContextSnapshot.cs, und löschen Sie sie.
  3. Erstellen Sie Ihre Lösung neu
  4. Lauf Add-Migration InitialMigration

Bitte beachten Sie: Sie müssen ALLE Snapshot-Dateien löschen . Ich habe unzählige Stunden damit verbracht, nur die Datenbank zu löschen ... Dies erzeugt eine leere Migration, wenn Sie dies nicht tun.

Außerdem können Sie in # 3 Ihre Migration einfach so benennen, wie Sie möchten.

Hier sind einige zusätzliche Ressourcen: asp.net CORE Migrationen werden leer generiert

Setzen Sie die Migrationen von Entity Framework 7 zurück

Jose A.
quelle
3

In EntityFramework 6 versuchen Sie bitte:

Add-Migration Initial

um die anfängliche Migrationsdatei zu aktualisieren.

Asaf
quelle
3

Im Entity Framework Core.

  1. Entfernen Sie alle Dateien aus dem Migrationsordner.
  2. Geben Sie die Konsole ein

dotnet ef database drop -f -v

dotnet ef migrations add Initial

Aktualisierung der dotnet ef-Datenbank

Liam Kernighan
quelle
2

Mein Problem stellte sich heraus, dass ich den Migrationsordner manuell entfernt habe. Ich habe das gemacht, weil ich den Inhalt sichern wollte, also habe ich den Ordner einfach aus dem Projekt gezogen. Ich habe das Problem später behoben, indem ich es wieder eingefügt habe (nachdem ich eine Sicherungskopie erstellt hatte), dann den Migrationsordner entfernt habe, indem ich im Projektmappen-Explorer mit der rechten Maustaste darauf geklickt und im Popup-Menü die Option Löschen ausgewählt habe.

John Deighan
quelle
1

In EF6

  1. Löschen Sie alle Ihre Dateien im Ordner "Migrationen" ... aber nicht "Erstes Erstellen" oder "Konfigurieren".
  2. Löschen Sie die Datenbank.
  3. Jetzt renn Add-Migration Initial.
  4. Jetzt können Sie 'Datenbank aktualisieren' und alles wird gut.
Adudley
quelle
1

Löschen Sie den MigrationsOrdner und Cleandann Rebuilddas Projekt. Das hat bei mir funktioniert. Vor dem Bereinigen und Wiederherstellen wurde angegeben, dass die Migration bereits vorhanden ist, da sie im zwischengespeicherten Speicher noch nicht gelöscht wurde.

Belagerung21x
quelle
0

Bei dieser Methode muss die __MigrationHistoryTabelle nicht gelöscht werden, sodass Sie die Datenbank bei der Bereitstellung nicht in die Hand nehmen müssen.

  1. Löschen Sie vorhandene Migrationen aus dem Ordner Migrationen.
  2. In der Package Manager-Konsole ausführen Add-Migration ResetMigrations
  3. Bereinigen Sie den Migrationsverlauf in der Up()Methode:
/// <summary>
/// Reset existing migrations by cleaning the __MigrationHistory table
/// and creating a new initial migration with the current model snapshot.
/// </summary>
public partial class ResetMigrations : DbMigration
{
    public override void Up()
    {
        Sql("DELETE FROM [dbo].[__MigrationHistory]");
    }

    public override void Down()
    {
    }
}
Olexander Ivanitskyi
quelle
0

In Net Core 3.0:

Ich konnte keinen Weg finden, Migrationen zurückzusetzen .

Ich hatte auch Probleme mit unterbrochenen Migrationen, und die hier angegebenen Antworten funktionierten bei mir nicht. Ich habe eine .Net Core 3.0-Web-API und irgendwo im letzten Monat habe ich die Datenbank direkt bearbeitet. Ja, ich habe eine schlechte, schlechte Sache gemacht.

Die hier vorgeschlagenen Strategien führten zu einer Reihe von Fehlern in der Package Manager-Konsole:

  • Eine Migration dieses Namens ist bereits vorhanden
  • Der Schnappschuss konnte nicht gefunden werden
  • 'Force' ist kein anerkannter Parameter

Zugegeben, ich habe vielleicht einen Schritt verpasst oder die richtigen Dateien gelöscht, aber ich habe festgestellt, dass es Möglichkeiten gibt, dies ohne so viel rohe Gewalt zu bereinigen:

  • Entfernen Sie die Migration aus dem PMC für jede Migration nach Namen in umgekehrter Reihenfolge der Erstellung bis einschließlich der fehlerhaften Migration
  • Add-Migration, um eine neue Migration zu erstellen, die das Delta zwischen der letzten guten Migration bis zum aktuellen Schema darstellt

Wenn die Web-API jetzt mit einer leeren Datenbank gestartet wird, werden alle Tabellen und Eigenschaften korrekt erstellt, damit sie mit den Entitätsmodellen übereinstimmen.

HTH!

greenCodeMonkey
quelle
0

UPDATE 2020

Add-Migration Initial -Context ApplicationDbContext

ApplicationDbContext => Ihr Kontext.

Diego Venâncio
quelle
-3
Enable-Migrations -EnableAutomaticMigrations -Force
Debendra Dash
quelle