Wenn Sie wissen, dass Ihre Datenbank und Ihr Code synchronisiert sind, und jetzt nur an etwas Einfachem wie Migrationen hängen bleiben, die versuchen, Aufgaben zu duplizieren, ist der einfachste Weg, Migrationen ohne Datenverlust neu zu beginnen:
- Löschen Sie den Ordner Migrations in VS.
- Erstellen Sie eine neue Migration (z.B.
add-migration InitialCreate
)
- Löschen Sie alle Zeilen außer der ersten aus der Datei
__EFMigrationsHistory
db und ändern Sie den Wert der ersten Zeile in Ihren ersten Migrationsnamen mit dem Datumscode (z. B. 20220510060015_InitialCreate
)
Wenn Sie nicht wissen, welche ProductVersion
für die Migrationstabelle, finden Sie in der Designer
o Snaphot
.cs
Dateien in den neu erstellten Ordner Migrations.
Wenn Sie nun update-database
sollte er ohne Fehler abgeschlossen werden (und keine Aufgaben ausführen). Dies könnte ein guter Weg sein, um ein möglichst sauberes SQL-Migrationsskript für eine anfängliche Produktionsumgebung zu erhalten, wenn Sie bei Ihren ersten Migrationen eine Reihe von Umbenennungen, Löschungen, Tabellen, Spalten usw. vornehmen würden.
Wenn Ihr Code und Ihre Datenbank nicht synchron sind, ist es wahrscheinlich am besten, die obigen Schritte 1 und 2 auszuführen, dann die Datenbank zu sichern, sie zu löschen und die Migrationen alles von Grund auf neu erstellen zu lassen und dann die Daten wiederherzustellen.
Microsoft: Verwalten von Migrationen - Zurücksetzen aller Migrationen
Um die oben genannten Schritte zu vermeiden, müssen Sie manchmal, wenn eine Migration auf halbem Weg scheitert, durch eine Migration gehen und jeden migrationBuilder-Block auskommentieren, der bereits abgeschlossen ist (in der Reihenfolge, in der sie erstellt wurden), insbesondere wenn dies aus dem Migrationsfehler nicht klar hervorgeht. Sie können sich also Ihre Datenbank ansehen und sehen, welche Tabellen, Spalten, FKs, Indizes usw. gelöscht, umbenannt, erstellt usw. wurden, und dann einfach die Liste der migrationBuilder-Blöcke durchgehen und die Migration schrittweise durchführen (die abgeschlossenen Schritte auskommentieren, update-database erneut ausführen, wiederholen). Wenn Sie fertig sind, kommentieren Sie alles aus.
Ein weiterer häufiger Fehler kann auftreten, wenn bereits Daten in der Tabelle vorhanden sind und Sie versuchen, eine FK-Beschränkung hinzuzufügen:
Hinzufügen oder Aktualisieren einer untergeordneten Zeile nicht möglich: eine Fremdschlüssel-Beschränkung schlägt fehl ( Database1
. #sql-alter-d9b-445b
CONSTRAINT FK_TableA_TableB_TableBId
FOREIGN KEY ( TableBId
) REFERENZEN TableB
(`TableBId)
Die Tabelle, für die Sie versuchen, eine FK-Beschränkung zu erstellen, stimmt in ihrer FK-Beschränkungsspalte mit nichts in der PK-Spalte der Primärtabelle überein. Am besten bereiten Sie sich darauf vor, indem Sie zuerst die PK-Tabelle mit einem Platzhalter für einen Standardwert erstellen, aber wenn Sie die Fehlermeldung bereits erhalten haben, sind wir hier. Der einfachste Weg, dies zu beheben, um einige der drastischeren Schritte oben zu vermeiden, ist,:
- Prüfen Sie, ob die FK-Spalte erstellt wurde und ob ihr ein Standardwert zugewiesen wurde (z. B. in TabelleA, FK-Beschränkung TabelleBId = "0").
- Ändern Sie die PK-Tabelle (oder erstellen Sie sie zuerst) mit einem Standard-PK-Id-Datensatz mit dem Wert, der in Schritt 1 zugewiesen wurde (z. B. erstellen Sie in TabelleB einen Datensatz mit TableBId = "0").
- Kommentieren Sie alles aus, bevor die
migrationBuilder.AddForeignKey
Block, bei dem ein Fehler aufgetreten ist, und führen Sie update-database
wieder. Die Migration sollte nun die FK-Beschränkung erstellen und abgeschlossen werden.
- Alles auskommentieren.