2013-04-16 11 views
43

Sto usando il codice EF prima con EF 5 in VS 2012. Uso il comando PM update-database e ho un semplice metodo seed per riempire alcune tabelle con dati di esempio.Come cancellare e ricreare un codice EF esistente Primo database

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

Come posso realizzare questo?

risposta

61

Se ho la comprensione nel modo giusto ...

Se si vuole start clean:

1) Eliminare manualmente il vostro DB - dovunque sia (sto supponendo che avete ordinato il vostro collegamento), o svuotarlo, ma più facile/più sicuro è quello di eliminarlo tutti insieme - in quanto vi è la tabella system __MigrationHistory - è necessario rimosso anche questo.

2) Rimuovi tutti migration files - che sono sotto Migrations - e nominato come i numeri, ecc - rimuovere tutti,

3) Rigenerare il progetto contenente le migrazioni (e il resto) - e assicurarsi che il progetto è impostato (configurazione) per creare automaticamente (che a volte può causare problemi - ma non probabile per voi),

4) Eseguire Add-Migration Initial ancora - allora Update-Database

+2

quindi non esiste un comando per consentire alle migrazioni di ef di eliminare il database stesso? – cjb110

+1

... per quanto ne so (non sono sicuro delle ultime versioni) - Le migrazioni EF/sono utili per "creare" quando non si usa Db e quindi "aggiornarle" mentre si cambia il codice. Ma quando è necessario eseguire alcuni interventi di manutenzione dell'amministratore, è necessario sporcarsi le mani. – NSGaga

+1

Ho anche dovuto rimuovere il database dall'esploratore oggetti del server SQL. –

40

Se hai lavorato il modo corretto per creare le migrazioni utilizzando il comando Add-Migration "Name_Of_Migration" allora si può fare quanto segue per ottenere un partenza pulita (reset, con perdita di dati, ovviamente):

  1. Update-database -TargetMigration:0

    Normalmente il DB è vuoto da quando sono stati eseguiti i metodi down.

  2. Update-database

    Questo sarà ricreare il DB per la migrazione corrente

+0

Update-database -TargetMigration: 0 richiede il flag -f (force) per eliminare tutto altrimenti dirà la possibile perdita di dati. Il comando dovrebbe essere: Update-database -TargetMigration: 0 -f – Tascalator

+0

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

+1

La sintassi equivalente in EF Core è semplicemente "Aggiornamento-Database 0". Si noti che questo è discutibile per il caso dell'OP in cui * "La cronologia degli aggiornamenti sembra essere fuori sincrono" *; questo approccio funziona eseguendo la migrazione "Down" per ogni migrazione finora applicata al database, quindi se hai eliminato una migrazione che era stata applicata in precedenza, allora fallirà (e potrebbe anche fallire se hai * modificato * a migrazione dopo averlo applicato). La [risposta accettata] (https://stackoverflow.com/a/16082497/1709587) potrebbe quindi essere preferibile in quanto funzionerà, non importa quanto tu abbia rovinato le tue migrazioni. –

2

ne dite ..

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

Ho scelto questo dal Programming Entity Framework: Code First, Pg 28 First Edition.

+5

Questo non è un buon ida.È probabile che questo codice possa raggiungere la produzione e finirai per avere un bel mal di testa con i tuoi clienti ... –

22

singolo Liner a cadere, creare e Seed dalla console Package Manager:

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

Kaboom.

+5

perché sarebbe necessario eseguire lo stesso passo due volte? "update-database -force" Intendo – SwissCoder

+0

Solo un piccolo avviso: "AutomaticMigrationDataLossAllowed = true;" è richiesto all'interno di Configration. – Unicco

+0

La sintassi equivalente in EF Core è semplicemente 'Aggiornamento-Database 0'. Indipendentemente da ciò, questo non è adatto per il caso dell'OP in cui * "La cronologia degli aggiornamenti sembra essere fuori sincrono" *; questo approccio funziona eseguendo la migrazione "Down" per ogni migrazione finora applicata al database, quindi se hai eliminato una migrazione che era stata applicata in precedenza, allora fallirà (e potrebbe anche fallire se hai * modificato * a migrazione dopo averlo applicato). La [risposta accettata] (https://stackoverflow.com/a/16082497/1709587) è più solida. -1 per quello, e la ripetizione inspiegabile di 'update-database -force'. –

0

Prendete questi passaggi:

  1. eliminare tali oggetto che deve essere eliminato dal contesto // Dbset<Item> Items{get;set;} e in Nuget Console eseguire questi comandi
  2. add-migrazione [contextName]
  3. aggiornamento database -verbose

Elimina le tabelle che non esistono nel contesto, ma sono già state create nel database

Problemi correlati