Ich bin mit meinem ASP.Net MVC 5-Projekt unter Verwendung des Code-First Entity Framework in einen schlechten Zustand geraten. Es ist mir egal, ob Daten verloren gehen, ich möchte nur in der Lage sein, neu zu starten, die Datenbank neu zu erstellen und Code-First-Migrationen zu verwenden.
Derzeit bin ich in einem Zustand, in dem jeder Versuch, die Datenbank zu aktualisieren, dazu führt, dass eine Ausnahme ausgelöst wird oder eine Fehlermeldung angezeigt wird. Außerdem kann die Website nicht korrekt auf die Datenbank zugreifen. Wie kann ich alle Migrationen löschen, die Datenbank neu erstellen und von vorne beginnen, ohne ein neues Projekt erstellen zu müssen? Mit anderen Worten, ich möchte meinen Code behalten, aber die Datenbank löschen.
Später möchte ich auch die Bereitstellungsdatenbank (SQL Server unter Azure) synchronisieren. Auch hier macht es mir nichts aus, alle Daten zu löschen - ich möchte nur, dass sie funktionieren.
Bitte geben Sie alle Schritte an, um zu einem sauberen Zustand zurückzukehren. Sehr geschätzt.
quelle
DROP DATABASE
dann ...Antworten:
Befolgen Sie die folgenden Schritte:
1) Gehen Sie zuerst in Visual Studio zum Server-Explorer und überprüfen Sie, ob die ".mdf" -Datenverbindungen für dieses Projekt verbunden sind. Klicken Sie in diesem Fall mit der rechten Maustaste und löschen Sie sie.
2) Gehen Sie zum Projektmappen-Explorer und klicken Sie auf das Symbol Alle Dateien anzeigen.
3) Gehen Sie zu App_Data, klicken Sie mit der rechten Maustaste und löschen Sie alle ".mdf" -Dateien für dieses Projekt.
4) Löschen Sie den Migrationsordner, indem Sie mit der rechten Maustaste klicken und löschen.
5) Gehen Sie zu SQL Server Management Studio und stellen Sie sicher, dass die Datenbank für dieses Projekt nicht vorhanden ist. Andernfalls löschen Sie sie.
6) Gehen Sie in Visual Studio zur Package Manager-Konsole und geben Sie Folgendes ein:
Enable-Migrations -Force
Add-Migration init
Update-Database
7) Führen Sie Ihre Anwendung aus
Hinweis: Wenn in Schritt 6 Teil 3 die Fehlermeldung "Datei kann nicht angehängt werden ..." angezeigt wird, liegt dies möglicherweise daran, dass Sie die Datenbankdateien in SQL Server nicht vollständig gelöscht haben.
quelle
Ich möchte hinzufügen, dass Lins Antwort richtig ist.
Wenn Sie das MDF nicht ordnungsgemäß löschen, müssen Sie es beheben. So befestigen Sie die im Projekt verschraubten Verbindungen am MDF. Kurze Antwort; neu erstellen und ordnungsgemäß löschen.
update-database -force
[Gegebenenfalls Gewalt anwenden]Fertig, genießen Sie Ihre neue Datenbank
UPDATE 11/12/14 - Ich benutze dies die ganze Zeit, wenn ich eine brechende Datenbankänderung vornehme. Ich fand, dass dies eine großartige Möglichkeit ist, Ihre Migrationen auf die ursprüngliche Datenbank zurückzusetzen:
Führen Sie die normale Migration aus, um sie wieder auf den aktuellen Stand zu bringen
Update-Database -TargetMigration:0 -force
[Dadurch werden alle Tabellen und alle Daten zerstört.]Update-Database -force
[ggf. Gewalt anwenden]quelle
Das hat bei mir funktioniert:
quelle
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.
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.
quelle
Ich möchte nur die hervorragende Antwort von @Lin ergänzen:
5) B. Wenn Sie nicht über SQL Management Studio verfügen, wechseln Sie zu "SQL Server Object Explorer". Wenn Sie Ihre Projektdatenbank im lokalen "SQL Server Object Explorer" nicht sehen können, klicken Sie auf die Schaltfläche "SQL Server hinzufügen", um sie manuell zur Liste hinzuzufügen. Dann können Sie die Datenbank aus der Liste löschen.
quelle
Eine mögliche sehr einfache Lösung, die bei mir funktioniert hat. Klicken Sie nach dem Löschen aller Datenbankreferenzen und Verbindungen, die Sie im Server / Serverobject-Explorer finden, mit der rechten Maustaste auf den Ordner App_Data (für mich wurden keine Objekte in der Anwendung angezeigt) und wählen Sie Öffnen. Nach dem Öffnen die gesamte Datenbank / etc. Dateien in einem Sicherungsordner oder wenn Sie den Mut haben, löschen Sie sie einfach. Führen Sie Ihre Anwendung aus, und sie sollte alles von Grund auf neu erstellen.
quelle
Meine Lösung eignet sich am besten für :
- Löschen Ihrer MDF-Datei
- Möchten Sie Ihre Datenbank neu erstellen.
Um Ihre Datenbank neu zu erstellen , müssen Sie die Verbindung mit Visual Studio hinzufügen.
Schritt 1 : Gehen Sie zum Server Explorer und fügen Sie eine neue Verbindung hinzu (oder suchen Sie nach einem Symbol zum Hinzufügen einer Datenbank).
Schritt 2 : Ändern Sie die Datenquelle in die Microsoft SQL Server-Datenbankdatei .
Schritt 3 : Fügen Sie einen beliebigen Datenbanknamen in das Feld Name der Datenbankdatei ein (vorzugsweise denselben Namen, den Sie im Attribut web.config AttachDbFilename haben).
Schritt 4 : Klicken Sie auf Durchsuchen und navigieren Sie zu dem Ort, an dem Sie ihn haben möchten.
Schritt 5 : Führen Sie im Befehl der Paketmanager-Konsole den Befehl aus
update-database
quelle