Come eliminare e ricreare da zero un database EF Code First esistente


84

Sto usando EF Code First con EF 5 in VS 2012. Uso il update-databasecomando PM e ho un semplice metodo seed per riempire alcune tabelle con dati di esempio.

Vorrei eliminare e ricreare il mio x.mdb. La cronologia degli aggiornamenti sembra non essere sincronizzata. Se commento tutti i miei DBSet nel mio contesto, update-databaseviene eseguito senza errori ma lascia alcune tabelle nel DB. Dato che non ho dati preziosi nel DB, sembra il più semplice ripristinare il tutto.

Come posso farlo?

Risposte:


112

Se lo capisco bene ...

Se vuoi start clean:

1) Elimina manualmente il tuo DB - ovunque si trovi (presumo che tu abbia la tua connessione ordinata), o svuotalo, ma più facile / sicuro è eliminarlo tutto insieme - dato che c'è una system __MigrationHistorytabella - devi anche rimuovere quella.

2) Rimuovi tutti quellimigration files che sono sotto Migrationse denominati come numeri ecc. Rimuovili tutti,

3) Ricostruisci il tuo progetto contenente le migrazioni (e il resto) e assicurati che il tuo progetto sia impostato (configurazione) per costruire automaticamente (che a volte può causare problemi - ma non è probabile per te),

4) Corri di Add-Migration Initialnuovo - alloraUpdate-Database


6
quindi non c'è un comando per ottenere ef migrations per eliminare il database stesso?
cjb110

1
... per quanto ne so (non sono sicuro delle ultime versioni) - EF / migrations sono bravi a "creare" quando non c'è Db, e quindi "aggiornare" man mano che cambi il codice. Ma quando hai bisogno di fare un po 'di manutenzione amministrativa devi sporcarti le mani
NSGaga-per lo più inattivo

1
Ho anche dovuto rimuovere il database dall'esploratore oggetti del server SQL.
Steven Jeuris

Ho dovuto riavviare Visual Studio prima di eseguire Update-Database per farlo funzionare. Al primo tentativo si è verificato un errore durante la generazione delle nuove strutture anche se la migrazione degli add è avvenuta senza problemi segnalati.
Patric

2
@lpacheco Se hai un database di produzione contenente dati che non vuoi distruggere allora, uh, suggerisco rispettosamente che una domanda intitolata "Come cancellare ... un database ... esistente" non era proprio la domanda giusta per te .
Mark Amery

60

Se hai lavorato nel modo corretto per creare le tue migrazioni utilizzando il comando Add-Migration "Name_Of_Migration", puoi fare quanto segue per ottenere un avvio pulito (ripristino, con perdita di dati, ovviamente ):

  1. Update-database -TargetMigration:0

    Normalmente il tuo DB è vuoto ora poiché i metodi down sono stati eseguiti.

  2. Update-database

    Questo ricrea il tuo DB con la tua attuale migrazione


1
Update-database -TargetMigration: 0 necessita del flag -f (force) per cancellare tutto altrimenti dirà possibile perdita di dati. Il comando dovrebbe essere: Update-database -TargetMigration: 0 -f
Tascalator

@ Tascalator, ho appena provato senza -f e non c'era alcun avviso sulla possibile perdita di dati. Utilizzando EF 6.1.2, c'erano dati nelle tabelle che sono stati eliminati.
jk7

Risposta perfetta. Facile e veloce! Thnx
sapatelbaps

Secondo EF Core Docs, il nome del parametro corretto è -Target (per EF Core 1.1) o -Migration (per EF Core 2.0)
Harvey Darvey

32

Single Liner per rilasciare, creare e seed dalla console di Package Manager:

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

Kaboom.


5
perché sarebbe necessario eseguire lo stesso passaggio due volte? "update-database -force" Voglio dire
SwissCoder

Solo un piccolo avviso: "AutomaticMigrationDataLossAllowed = true;" è richiesto in Configration.
Unicco

2
La sintassi equivalente in EF Core è just Update-Database 0. Indipendentemente da ciò, questo non è adatto per il caso dell'OP in cui "La cronologia degli aggiornamenti sembra non essere sincronizzata" ; questo approccio funziona eseguendo la migrazione "Down" per ogni migrazione finora applicata al database, quindi se hai eliminato una migrazione applicata in precedenza, questa non andrà a buon fine (e allo stesso modo potrebbe non riuscire se hai modificato una migrazione dopo applicandolo). La risposta accettata è più robusta. -1 per questo, e la ripetizione inspiegabile di update-database -force.
Mark Amery

1
@SwissCoder - non hai bisogno dello stesso passaggio due volte (almeno, non l'ho fatto). Penso che sia stato un errore di battitura.
Ed Graham

1
@SwissCoder Onestamente non l'ho notato, senza offesa
Vima91

32

Per EntityFrameworkCore puoi utilizzare quanto segue:

Update-Database -Migration 0

Ciò rimuoverà tutte le migrazioni dal database. Quindi puoi usare:

Remove-Migration

Per rimuovere la tua migrazione. Finalmente puoi ricreare la tua migrazione e applicarla al database.

Add-Migration Initialize
Update-Database

Testato su EFCore v2.1.0


2
Funziona come un fascino!
pavelnieks

Non funziona su 5
user77232

@ user77232 Siamo spiacenti di apprendere che non funziona più su .net 5. Hanno cambiato i comandi che usi nel gestore dei pacchetti? Non ho lavorato con EF per un po 'quindi non ne sono sicuro.
Gizmo3399

Sono corretto. È "-Migration 0". Pensavo dovessi mettere il nome della migrazione a cui volevi tornare. Funziona in 5!
user77232

4

Che ne dite di ..

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

L'ho preso da Programming Entity Framework: Code First , Pg 28 First Edition.


11
Questa non è una buona ida. È probabile che questo codice raggiunga la produzione e finirai per avere un bel mal di testa con i tuoi clienti ...
Amadeo Gallardo

Questo elimina il database solo se il modello cambia, OP vuole eliminarlo anche senza una modifica del modello.
Quantic


0

Segui questi passaggi:

  1. Elimina quegli oggetti che dovrebbero essere eliminati dal contesto // Dbset<Item> Items{get;set;} e in Nuget Console esegui questi comandi
  2. add-migration [contextName]
  3. aggiornamento-database -verbose

Eliminerà le tabelle che non esistono nel contesto, ma già create nel database


0

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


0

Lascia che ti aiuti ad aggiornare le risposte qui poiché i nuovi utenti lo troveranno utile. Credo che l'obiettivo sia eliminare il database stesso e ricrearlo utilizzando l'approccio EF Code First. 1. Apri il tuo progetto in Visual Studio utilizzando l'estensione ".sln". 2.Seleziona Esplora server (è spesso a sinistra) 3.Seleziona Esplora oggetti di SQL Server. 4. Il database che si desidera eliminare verrà elencato in uno qualsiasi dei database locali. Fare clic con il pulsante destro del mouse e selezionare Elimina.


Sembra che l'OP stesse cercando un comando eseguito sulla riga di comando, poiché menzionato esplicitamente update-databasee poiché menziona il seeding, presumo che stessero cercando una soluzione automatizzata per il test. Pertanto la tua soluzione di interfaccia utente probabilmente non è quello che stanno cercando.
valkn0t

0

Esistono molti modi per eliminare un database o aggiornare un database esistente, è sufficiente passare alle migrazioni precedenti.

dotnet ef database update previousMigraionName    

Ma alcuni database hanno limitazioni come non consentire la modifica dopo la creazione di relazioni, significa che non si hanno i privilegi per eliminare colonne dai provider di database ef core, ma la maggior parte del tempo è consentito nel database drop ef core. Quindi è possibile eliminare DB utilizzando il comando drop e quindi utilizzi di nuovo la migrazione precedente.

dotnet ef database drop
PMC command 
PM> drop-database

OPPURE puoi eliminare manualmente il database ed eseguire una migrazione.


-2

Dato che prima o poi questa domanda verrà cliccata da nuovi utenti EF Core e trovo che le risposte migliori siano inutilmente distruttive, ti mostrerò un modo per ricominciare da capo. Attenzione, questo elimina tutti i tuoi dati.

  1. Elimina tutte le tabelle sul tuo server MS SQL. Elimina anche la tabella __EFMigrations.
  2. genere dotnet ef database update
  3. EF Core ora ricrea il database da zero fino all'ultima migrazione.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.