So löschen und erstellen Sie eine vorhandene EF Code First-Datenbank von Grund auf neu


84

Ich verwende EF Code First mit EF 5 in VS 2012. Ich verwende den PM- update-databaseBefehl und habe eine einfache Seed-Methode, um einige Tabellen mit Beispieldaten zu füllen.

Ich möchte meine x.mdb löschen und neu erstellen. Der Update-Verlauf scheint nicht synchron zu sein. Wenn ich alle meine DBSets in meinem Kontext auskommentiere, wird sie update-databasefehlerfrei ausgeführt, es verbleiben jedoch einige Tabellen in der Datenbank . Da ich keine wertvollen Daten in der Datenbank habe, scheint es am einfachsten zu sein, alles zurückzusetzen.

Wie kann ich das erreichen?

Antworten:


107

Wenn ich es richtig verstehe ...

Wenn Sie möchten start clean:

1) Löschen Sie Ihre Datenbank manuell - wo immer sie ist (ich gehe davon aus, dass Sie Ihre Verbindung sortiert haben) oder leeren Sie sie, aber einfacher / sicherer ist es, alles zusammen zu löschen - da es eine system __MigrationHistoryTabelle gibt - müssen Sie diese auch entfernen.

2) Entfernen Sie allemigration files - die unter Migrations- und wie Zahlen usw. benannt sind - entfernen Sie sie alle,

3) Erstellen Sie Ihr Projekt mit Migrationen (und dem Rest) neu - und stellen Sie sicher, dass Ihr Projekt so eingerichtet ist (Konfiguration), dass es automatisch erstellt wird (was manchmal Probleme verursachen kann - aber für Sie wahrscheinlich nicht).

4) Add-Migration InitialDann erneut ausführenUpdate-Database


5
Es gibt also keinen Befehl, um ef-Migrationen zum Löschen der Datenbank selbst zu veranlassen.
cjb110

1
... soweit ich weiß (nicht sicher über die neuesten Versionen) - EF / Migrationen können gut "erstellen", wenn keine Datenbank vorhanden ist, und dann "aktualisieren", wenn Sie den Code ändern. Aber wenn Sie einige Administratorwartungen durchführen müssen, müssen Sie sich die Hände schmutzig machen
NSGaga-meistens-inaktiv

1
Ich musste auch die Datenbank aus dem SQL Server-Objektexplorer entfernen.
Steven Jeuris

Ich musste Visual Studio neu starten, bevor ich Update-Database ausführen konnte, damit es funktioniert. Beim ersten Versuch trat während der Generierung der neuen Strukturen ein Fehler auf, obwohl die Add-Migration ohne gemeldete Probleme durchgeführt wurde.
Patric

2
@lpacheco Wenn Sie eine Produktionsdatenbank haben, die Daten enthält, die Sie nicht zerstören möchten, dann schlage ich respektvoll vor, dass eine Frage mit dem Titel "So löschen Sie ... eine vorhandene ... Datenbank" nicht ganz die richtige Frage für Sie war .
Mark Amery

60

Wenn Sie mit dem Befehl richtig gearbeitet haben, um Ihre Migrationen zu erstellen Add-Migration "Name_Of_Migration", können Sie Folgendes tun, um einen sauberen Start zu erzielen (Zurücksetzen, natürlich mit Datenverlust ):

  1. Update-database -TargetMigration:0

    Normalerweise ist Ihre Datenbank jetzt leer, da die Down-Methoden ausgeführt wurden.

  2. Update-database

    Dadurch wird Ihre Datenbank für Ihre aktuelle Migration neu erstellt


1
Update-Datenbank -TargetMigration: 0 benötigt das Flag -f (force), um alles zu löschen. Andernfalls wird ein möglicher Datenverlust angezeigt. Befehl sollte sein: Update-Datenbank -TargetMigration: 0 -f
Tascalator

@Tascalator, ich habe es nur ohne -f versucht und es gab keine Warnung vor einem möglichen Datenverlust. Bei Verwendung von EF 6.1.2 wurden Daten in den Tabellen gelöscht.
jk7

10
Die äquivalente Syntax in EF Core ist gerecht Update-Database 0. Beachten Sie, dass dies für den Fall des OP fraglich ist, in dem "Der Aktualisierungsverlauf scheint nicht synchron zu sein" . Bei diesem Ansatz wird die "Down" -Migration für jede bisher auf die Datenbank angewendete Migration ausgeführt. Wenn Sie also eine zuvor angewendete Migration gelöscht haben, schlägt dies fehl (und es kann ebenfalls fehlschlagen, wenn Sie eine Migration danach geändert haben anwenden). Die akzeptierte Antwort kann daher vorzuziehen sein, da sie funktioniert, egal wie sehr Sie Ihre Migrationen versaut haben.
Mark Amery

Perfekte Antwort. Schnell und einfach! Thnx
sapatelbaps

Laut EF Core Docs lautet der korrekte Parametername -Target (für EF Core 1.1) oder -Migration (für EF Core 2.0)
Harvey Darvey

32

Single Liner zum Löschen, Erstellen und Seed von der Package Manager-Konsole:

update-database -TargetMigration:0 | update-database -force

Kaboom.


5
warum sollte es notwendig sein, denselben Schritt zweimal auszuführen? "update-database -force" meine ich
SwissCoder

Nur ein kleiner Hinweis: "AutomaticMigrationDataLossAllowed = true;" ist innerhalb der Konfigration erforderlich.
Unicco

2
Die äquivalente Syntax in EF Core ist gerecht Update-Database 0. Unabhängig davon passt dies nicht zu dem Fall des OP, in dem "Der Update-Verlauf scheint nicht synchron zu sein" . Bei diesem Ansatz wird die "Down" -Migration für jede bisher auf die Datenbank angewendete Migration ausgeführt. Wenn Sie also eine zuvor angewendete Migration gelöscht haben, schlägt dies fehl (und es kann ebenfalls fehlschlagen, wenn Sie eine Migration danach geändert haben anwenden). Die akzeptierte Antwort ist robuster. -1 dafür und die ungeklärte Wiederholung von update-database -force.
Mark Amery

1
@SwissCoder - du brauchst nicht zweimal denselben Schritt (zumindest habe ich das nicht getan). Ich denke das war ein Tippfehler.
Ed Graham

1
@ SwissCoder Ehrlich gesagt habe ich nicht bemerkt, keine Straftat beabsichtigt
Vima91

31

Für EntityFrameworkCore können Sie Folgendes verwenden:

Update-Database -Migration 0

Dadurch werden alle Migrationen aus der Datenbank entfernt. Dann können Sie verwenden:

Remove-Migration

So entfernen Sie Ihre Migration. Schließlich können Sie Ihre Migration neu erstellen und auf die Datenbank anwenden.

Add-Migration Initialize
Update-Database

Getestet auf EFCore v2.1.0


2
Klappt wunderbar!
Pavelnieks

4

Wie wäre es mit ..

static void Main(string[] args)
{
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ExampleContext>());  
    // C
    // o
    // d
    // i
    // n
    // g
}

Ich habe dies aus dem Programming Entity Framework übernommen: Code First , S. 28 First Edition.


10
Das ist keine gute Ida. Es besteht die Möglichkeit, dass dieser Code die Produktion erreicht und Sie mit Ihren Kunden Kopfschmerzen haben ...
Amadeo Gallardo

Dadurch wird die Datenbank nur gelöscht, wenn sich das Modell ändert. OP möchte sie auch ohne Modelländerung löschen.
Quantic


0

Führen Sie die folgenden Schritte aus:

  1. Löschen Sie die Objekte, die aus dem // Kontext gelöscht werden sollen, Dbset<Item> Items{get;set;} und führen Sie diese Befehle in der Nuget Console aus
  2. Add-Migration [Kontextname]
  3. Update-Datenbank -verbose

Es werden Tabellen gelöscht, die nicht im Kontext vorhanden sind, aber bereits in der Datenbank erstellt wurden


0

dbctx.Database.EnsureDeleted (); dbctx.Database.EnsureCreated ();


0

Lassen Sie mich bei der Aktualisierung der Antworten hier helfen, da neue Benutzer dies nützlich finden. Ich glaube, das Ziel ist es, die Datenbank selbst zu löschen und sie mit dem EF Code First-Ansatz neu zu erstellen. 1.Öffnen Sie Ihr Projekt in Visual Studio mit der Erweiterung ".sln". 2.Wählen Sie Server Explorer (häufig links). 3.Wählen Sie SQL Server Object Explorer. 4.Die Datenbank, die Sie löschen möchten, wird in einer der lokalen Datenbanken aufgeführt. Klicken Sie mit der rechten Maustaste darauf und wählen Sie Löschen.


Es scheint, als hätte das OP nach einem Befehl gesucht, der in der Befehlszeile ausgeführt wurde, da dies ausdrücklich erwähnt update-databasewurde und da er das Seeding erwähnt, gehe ich davon aus, dass sie nach einer automatisierten Lösung zum Testen suchten. Daher ist Ihre UI-Lösung wahrscheinlich nicht das, wonach sie suchen.
valkn0t

-2

Da diese Frage eines Tages von neuen EF Core-Benutzern angeklickt wird und ich die Top-Antworten als unnötig destruktiv empfinde, werde ich Ihnen einen Weg zeigen, wie Sie "neu" anfangen können. Beachten Sie, dass dadurch alle Ihre Daten gelöscht werden.

  1. Löschen Sie alle Tabellen auf Ihrem MS SQL Server. Löschen Sie auch die __EFMigrations-Tabelle.
  2. Art dotnet ef database update
  3. EF Core erstellt die Datenbank jetzt von Null bis zu Ihrer letzten Migration neu.
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.