Wie erstelle ich eine Datenbank für Entity Framework neu?


143

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.


TBH, wenn Sie einfach wollen, DROP DATABASEdann ...
Worthy7

Antworten:


209

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:

  1. Enable-Migrations -Force
  2. Add-Migration init
  3. 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.


Ausgezeichnet! Das hat funktioniert, danke! Sehr hilfreich. Sind die Schritte zum Neuerstellen der Bereitstellungsdatenbank (Azure SQL) ähnlich?
Toby Sharp

Hallo @TobySharp, keine Probleme. Wenn Sie keine Daten in Ihrer Datenbank haben, können Sie diese Schritte ausführen. Wenn Sie jedoch Daten haben, sind die Schritte nicht ganz dieselben.
Lin

Ich habe keine Daten, die ich behalten muss.
Toby Sharp

3
Update, wenn Sie aus VS löschen (wie in den Anweisungen angegeben) und nicht Windows Explorer, dann funktioniert es. Wenn Sie nicht über SQL Management Studio verfügen, können Sie den SQL Object Explorer in VS zum Löschen aus einem Localdb verwenden.
Mike Ward

3
Wenn Sie den Fehler "Datei kann nicht angehängt werden ..." erhalten, versuchen Sie die Antwort aus diesem Thread: stackoverflow.com/questions/13275054/…
Andy

44

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.

  1. Erstellen Sie ein neues MDF, benennen Sie es wie das alte MDF und legen Sie es im selben Ordner ab. Sie können ein neues Projekt erstellen und ein neues MDF erstellen. Das MDF muss nicht mit Ihren alten Tabellen übereinstimmen, da es gelöscht werden sollte. Erstellen oder kopieren Sie also einen alten in den richtigen Ordner.
  2. Öffnen Sie es im Server-Explorer [Doppelklicken Sie im Solution Explorer auf das MDF]
  3. Löschen Sie es im Server Explorer
  4. Löschen Sie es aus dem Solution Explorer
  5. run 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:

  • Setzt die Datenbank auf das Original zurück
  • Führen Sie die normale Migration aus, um sie wieder auf den aktuellen Stand zu bringen

    1. Update-Database -TargetMigration:0 -force [Dadurch werden alle Tabellen und alle Daten zerstört.]
    2. Update-Database -force [ggf. Gewalt anwenden]

1
Sehr froh zu helfen ... Ich werde meine Antwort aktualisieren. Ich habe kürzlich einen besseren Weg gefunden, um alle Änderungen rückgängig zu machen.
Steve Coleman

8

Das hat bei mir funktioniert:

  1. Löschen Sie die Datenbank aus dem SQL Server-Objekt-Explorer in Visual Studio. Klicken Sie mit der rechten Maustaste und wählen Sie Löschen.
  2. Löschen Sie MDF- und LDF-Dateien aus dem Dateisystem - sofern sie noch vorhanden sind.
  3. Lösung neu erstellen.
  4. Anwendung starten - Datenbank wird neu erstellt.

1
Ja, ich musste nur die MDF löschen, die Verbindungszeichenfolge in der web.config aktualisieren, dann die Anwendung ausführen und ein neues Konto registrieren. Alle Tabellen in der neuen Datenbank wurden automatisch neu erstellt.
Dan Bechard

3

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.


1

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.


Wenn Sie einer Antwort etwas hinzufügen möchten, fügen Sie dieser Antwort bitte einen Kommentar hinzu, anstatt eine neue Antwort zu veröffentlichen.
Oliver

1
Das war mir nicht bewusst. Jetzt können Sie Ihre Antwort in einen Kommentar verschieben und diese Antwort löschen, da es sich technisch gesehen nicht um eine (vollständige) Antwort auf die Frage handelt :-)
Oliver

0

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.


0

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 ausupdate-database

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.