Jak usunąć i ponownie utworzyć od podstaw istniejącą bazę danych EF Code First


84

Używam EF Code First z EF 5 w VS 2012. Używam update-databasepolecenia PM i mam prostą metodę inicjatora, aby wypełnić niektóre tabele przykładowymi danymi.

Chciałbym usunąć i ponownie utworzyć plik x.mdb. Wydaje się, że historia aktualizacji nie jest zsynchronizowana. Jeśli skomentuję wszystkie moje zestawy DBSets w moim kontekście, update-databasedziała bez błędów, ale pozostawia niektóre tabele w DB. Ponieważ nie mam cennych danych w DB, najprościej jest zresetować wszystko.

Jak mogę to osiągnąć?

Odpowiedzi:


110

Jeśli dobrze to rozumiem ...

Jeśli chcesz start clean:

1) Ręcznie usuń swoją bazę danych - gdziekolwiek to jest (zakładam, że masz posortowane połączenie) lub opróżnij ją, ale łatwiej / bezpieczniej jest usunąć ją razem - ponieważ jest system __MigrationHistorytabela - musisz ją również usunąć.

2) Usuń wszystkiemigration files - które są pod Migrations- i nazwane jak liczby itp. - usuń je wszystkie,

3) Przebuduj swój projekt zawierający migracje (i resztę) - i upewnij się, że Twój projekt jest skonfigurowany (konfiguracja) do automatycznego budowania (co czasami może powodować problemy - ale raczej nie dla Ciebie),

4) Uruchom Add-Migration Initialponownie - wtedyUpdate-Database


6
więc nie ma polecenia, aby uzyskać migracje ef, aby usunąć samą bazę danych?
cjb110,

1
... o ile wiem (nie jestem pewien co do najnowszych wersji) - EF / migracje są dobre w „tworzeniu”, gdy nie ma Db, a następnie „aktualizowaniu” podczas zmiany kodu. Ale kiedy musisz zrobić jakąś konserwację administracyjną, musisz ubrudzić sobie ręce
NSGaga-głównie-nieaktywny

1
Musiałem również usunąć bazę danych z eksploratora obiektów serwera SQL.
Steven Jeuris

Musiałem ponownie uruchomić program Visual Studio przed uruchomieniem Update-Database, aby działał. Podczas pierwszej próby wystąpił błąd podczas generowania nowych struktur, chociaż migracja dodatków przebiegła bez żadnych zgłoszonych problemów.
Patric

2
@lpacheco Jeśli masz produkcyjną bazę danych zawierającą dane, których nie chcesz zniszczyć, to z szacunkiem sugeruję, że pytanie zatytułowane „Jak usunąć… istniejącą… bazę danych” nie było dla Ciebie właściwym pytaniem .
Mark Amery,

60

Jeśli pracujesz we właściwy sposób, aby utworzyć migracje za pomocą polecenia Add-Migration "Name_Of_Migration", możesz wykonać następujące czynności, aby uzyskać czysty start (reset, oczywiście z utratą danych ):

  1. Update-database -TargetMigration:0

    Zwykle twoja baza danych jest teraz pusta, ponieważ metody w dół zostały wykonane.

  2. Update-database

    Spowoduje to odtworzenie bazy danych do bieżącej migracji


1
Update-database -TargetMigration: 0 potrzebuje flagi -f (force), aby usunąć wszystko, w przeciwnym razie poinformuje o możliwej utracie danych. Polecenie powinno brzmieć: Update-database -TargetMigration: 0 -f
Tascalator

@ Tascalator, właśnie spróbowałem tego bez -f i nie było ostrzeżenia o możliwej utracie danych. Używając EF 6.1.2, aw tabelach były dane, które zostały usunięte.
jk7

Doskonała odpowiedź. Szybko i łatwo! Thnx
sapatelbaps

Zgodnie z EF Core Docs, poprawna nazwa parametru to -Target (dla EF Core 1.1) lub -Migration (for EF Core 2.0)
Harvey Darvey

32

Pojedyncza linijka do upuszczania, tworzenia i wysyłania z konsoli menedżera pakietów:

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

Kaboom.


5
dlaczego miałoby być wymagane dwukrotne wykonanie tego samego kroku? „update-database -force” mam na myśli
SwissCoder

Tylko mała uwaga: „AutomaticMigrationDataLossAllowed = true;” jest wymagany w programie Configration.
Unicco

2
Równoważna składnia w EF Core to po prostu Update-Database 0. Niezależnie od tego, nie pasuje to do przypadku OP, w którym „Historia aktualizacji wydaje się być niezsynchronizowana” ; to podejście działa poprzez uruchomienie migracji „w dół” dla każdej migracji przeprowadzonej do tej pory w bazie danych, więc jeśli usunąłeś migrację, która była wcześniej zastosowana, to się nie powiedzie (i może się również nie powieść, jeśli zmodyfikujesz migrację stosując go). Odpowiedź akceptowana jest bardziej niezawodny. -1 za to i niewyjaśnione powtórzenie update-database -force.
Mark Amery,

1
@SwissCoder - nie potrzebujesz tego samego kroku dwa razy (przynajmniej ja nie). Myślę, że to była literówka.
Ed Graham

1
@SwissCoder Szczerze mówiąc, nie zauważyłem, bez zamierzonej obrazy
Vima91

31

W przypadku EntityFrameworkCore możesz użyć następujących:

Update-Database -Migration 0

Spowoduje to usunięcie wszystkich migracji z bazy danych. Następnie możesz użyć:

Remove-Migration

Aby usunąć migrację. Wreszcie możesz odtworzyć migrację i zastosować ją do bazy danych.

Add-Migration Initialize
Update-Database

Przetestowano na EFCore v2.1.0


2
Działa jak marzenie!
pavelnieks

4

Co powiesz na ..

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

Wybrałem to z Programming Entity Framework: Code First , Pg 28 First Edition.


11
To nie jest dobra ida. Jest szansa, że ​​ten kod trafi do produkcji, a klienci będą mieli spory ból głowy ...
Amadeo Gallardo

Spowoduje to usunięcie bazy danych tylko w przypadku zmiany modelu, OP chce ją porzucić nawet bez zmiany modelu.
Quantic,


0

Wykonaj następujące kroki:

  1. Usuń te obiekty, które powinny zostać usunięte z kontekstu // Dbset<Item> Items{get;set;} iw konsoli Nuget uruchom te polecenia
  2. add -igration [nazwa kontekstu]
  3. update-database -verbose

Spowoduje to usunięcie tabel, które nie istnieją w kontekście, ale zostały już utworzone w bazie danych


0

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


0

Pozwól, że pomogę w aktualizacji odpowiedzi tutaj, ponieważ nowi użytkownicy uznają to za przydatne. Uważam, że celem jest usunięcie samej bazy danych i odtworzenie jej przy użyciu podejścia EF Code First. 1. Otwórz projekt w programie Visual Studio, używając rozszerzenia „.sln”. 2. Wybierz Eksplorator serwera (często znajduje się po lewej stronie) 3. Wybierz Eksplorator obiektów SQL Server. 4. Baza danych, którą chcesz usunąć, byłaby wymieniona w dowolnej lokalnej bazie danych. Kliknij prawym przyciskiem myszy i wybierz usuń.


Wygląda na to, że OP szukał polecenia uruchamianego w wierszu poleceń, ponieważ wyraźnie o tym wspomnieli update-database, a ponieważ wspomina o seedowaniu, zakładam, że szukał automatycznego rozwiązania do testowania. Dlatego Twoje rozwiązanie UI prawdopodobnie nie jest tym, czego szukają.
valkn0t

0

Istnieje wiele sposobów usunięcia bazy danych lub zaktualizowania istniejącej bazy danych, po prostu możesz przełączyć się na poprzednie migracje.

dotnet ef database update previousMigraionName    

Ale niektóre bazy danych mają ograniczenia, takie jak brak zezwolenia na modyfikację po utworzeniu relacji, co oznacza, że ​​nie masz uprawnień do usuwania kolumn z ef core dostawców baz danych, ale przez większość czasu w ef core drop baza danych jest dozwolona. Więc możesz usunąć DB za pomocą polecenia drop, a następnie używasz ponownie poprzedniej migracji.

dotnet ef database drop
PMC command 
PM> drop-database

LUB możesz ręcznie usunąć bazę danych i przeprowadzić migrację.


-2

Ponieważ to pytanie zostanie kiedyś kliknięte przez nowych użytkowników EF Core i uważam, że najlepsze odpowiedzi są nieco niepotrzebnie destrukcyjne, pokażę ci sposób, aby zacząć „od nowa”. Uważaj, spowoduje to usunięcie wszystkich danych.

  1. Usuń wszystkie tabele na serwerze MS SQL. Usuń również tabelę __EFMigrations.
  2. Rodzaj dotnet ef database update
  3. EF Core ponownie utworzy bazę danych od zera do ostatniej migracji.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.