Während diese Frage vorausgesetzt wird, dass man sich nicht um die Daten kümmert, ist manchmal die Pflege der Daten unerlässlich.
In diesem Fall habe ich eine Liste mit Schritten zum Wiederherstellen aus dem Entity Framework-Albtraum geschrieben, wenn die Datenbank bereits Tabellen mit demselben Namen enthält: Wiederherstellen aus dem Entity Framework-Albtraum - Die Datenbank enthält bereits Tabellen mit demselben Namen
Anscheinend ... hielt es ein Moderator für angebracht, meinen Beitrag zu löschen, also füge ich ihn hier ein:
Wiederherstellen von Entity Framework-Albtraum - Die Datenbank enthält bereits Tabellen mit demselben Namen
Beschreibung : Wenn Sie wie wir sind, wenn Ihr Team neu bei EF ist, befinden Sie sich in einem Zustand, in dem Sie entweder keine neue lokale Datenbank erstellen oder keine Aktualisierungen auf Ihre Produktionsdatenbank anwenden können. Sie möchten zu einer sauberen EF-Umgebung zurückkehren und sich dann an die Grundlagen halten, können dies aber nicht. Wenn Sie es für die Produktion zum Laufen bringen, können Sie keine lokale Datenbank erstellen. Wenn Sie es für die lokale Arbeit zum Laufen bringen, ist Ihr Produktionsserver nicht mehr synchron. Und schließlich möchten Sie keine Produktionsserverdaten löschen.
Symptom : Update-Database kann nicht ausgeführt werden, da versucht wird, das Erstellungsskript auszuführen, und die Datenbank bereits Tabellen mit demselben Namen enthält.
Fehlermeldung: System.Data.SqlClient.SqlException (0x80131904): In der Datenbank befindet sich bereits ein Objekt mit dem Namen ''.
Problemhintergrund : EF versteht anhand einer Tabelle in der Datenbank mit dem Namen dbo .__ MigrationHistory, wo sich die aktuelle Datenbank befindet und wo sich der Code befindet. Wenn es sich die Migrationsskripte ansieht, versucht es erneut zu überprüfen, wo es zuletzt mit den Skripten war. Wenn dies nicht möglich ist, wird nur versucht, sie der Reihe nach anzuwenden. Dies bedeutet, dass es zum ursprünglichen Erstellungsskript zurückkehrt. Wenn Sie sich den ersten Teil des UP-Befehls ansehen, ist dies die CreeateTable für die Tabelle, in der der Fehler aufgetreten ist.
Um dies genauer zu verstehen, würde ich empfehlen, beide Videos anzusehen, auf die hier verwiesen wird:
https://msdn.microsoft.com/en-us/library/dn481501(v=vs.113).aspx
Lösung : Wir müssen EF dazu verleiten, zu glauben, dass die aktuelle Datenbank auf dem neuesten Stand ist, ohne diese CreateTable-Befehle anzuwenden. Gleichzeitig möchten wir weiterhin, dass diese Befehle vorhanden sind, damit wir neue lokale Datenbanken erstellen können.
Schritt 1: Bereinigung
der Produktionsdatenbank Erstellen Sie zunächst eine Sicherungskopie Ihrer Produktionsdatenbank. Klicken Sie in SSMS mit der rechten Maustaste auf die Datenbank, wählen Sie "Aufgaben> Datenebenenanwendung exportieren ..." und befolgen Sie die Anweisungen. Öffnen Sie Ihre Produktionsdatenbank und löschen / löschen Sie die Tabelle dbo .__ MigrationHistory.
Schritt 2: Bereinigen der lokalen Umgebung
Öffnen Sie Ihren Migrationsordner und löschen Sie ihn. Ich gehe davon aus, dass Sie dies alles bei Bedarf von git zurückbekommen können.
Schritt 3: Initial neu
erstellen Führen Sie im Paket-Manager "Enable-Migrations" aus (EF fordert Sie auf, -ContextTypeName zu verwenden, wenn Sie mehrere Kontexte haben). Führen Sie "Add-Migration Initial -verbose" aus. Dadurch wird das erste Skript erstellt, um die Datenbank basierend auf dem aktuellen Code von Grund auf neu zu erstellen. Wenn Sie in der vorherigen Configuration.cs Seed-Operationen hatten, kopieren Sie diese über.
Schritt 4: Trick EF
Wenn wir zu diesem Zeitpunkt Update-Database ausführen , erhalten wir den ursprünglichen Fehler. Wir müssen EF also dazu verleiten, zu denken, dass es aktuell ist, ohne diese Befehle auszuführen. Gehen Sie also in der soeben erstellten Erstmigration in die Up-Methode und kommentieren Sie alles aus.
Schritt 5: Update-Datenbank
Da beim Up-Prozess kein Code ausgeführt werden muss, erstellt EF die Tabelle dbo .__ MigrationHistory mit dem richtigen Eintrag, um zu bestätigen, dass dieses Skript korrekt ausgeführt wurde. Probieren Sie es aus, wenn Sie möchten. Kommentieren Sie nun diesen Code aus und speichern Sie ihn. Sie können Update-Database erneut ausführen, wenn Sie überprüfen möchten, ob EF es für aktuell hält. Der Schritt "Auf" wird nicht mit allen CreateTable-Befehlen ausgeführt, da dies der Fall ist.
Schritt 6: Bestätigen Sie, dass EF tatsächlich auf dem neuesten Stand ist.
Wenn Sie Code hatten, auf den noch keine Migrationen angewendet wurden, habe ich Folgendes getan ...
Führen Sie "Add-Migration MissingMigrations" aus. Dadurch wird praktisch ein leeres Skript erstellt. Da der Code bereits vorhanden war, gab es im anfänglichen Migrationsskript tatsächlich die richtigen Befehle zum Erstellen dieser Tabellen. Daher habe ich nur die Befehle CreateTable und die entsprechenden Drop-Befehle in die Up- und Down-Methoden geschnitten.
Führen Sie nun Update-Database erneut aus und beobachten Sie, wie Ihr neues Migrationsskript ausgeführt wird, und erstellen Sie die entsprechenden Tabellen in der Datenbank.
Schritt 7: Erneut bestätigen und festschreiben.
Erstellen, testen, ausführen. Stellen Sie sicher, dass alles ausgeführt wird, und übernehmen Sie die Änderungen.
Schritt 8: Lassen Sie den Rest Ihres Teams wissen, wie es weitergehen soll.
Wenn die nächste Person aktualisiert wird, weiß EF nicht, was sie getroffen hat, da die zuvor ausgeführten Skripte nicht vorhanden sind. Vorausgesetzt, dass lokale Datenbanken weggeblasen und neu erstellt werden können, ist dies alles gut. Sie müssen ihre lokale Datenbank löschen und erneut aus EF erstellen. Wenn sie lokale Änderungen und ausstehende Migrationen hatten, würde ich empfehlen, dass sie ihre Datenbank auf dem Master erneut erstellen, zu ihrem Feature-Zweig wechseln und diese Migrationsskripte von Grund auf neu erstellen.
DROP DATABASE
dann ...