Come ricreare il database per Entity Framework?


143

Ho avuto un cattivo stato con il mio progetto ASP.Net MVC 5, usando Code-First Entity Framework. Non mi interessa perdere i dati, voglio solo essere in grado di ricominciare da capo, ricreare il database e iniziare a utilizzare le migrazioni Code-First.

Attualmente mi trovo in uno stato in cui ogni tentativo di aggiornamento del database comporta la generazione di un'eccezione o la visualizzazione di un messaggio di errore. Inoltre, il sito Web non può accedere correttamente al database. Come posso cancellare tutte le migrazioni, ricreare il database e ricominciare da capo senza dover creare un nuovo progetto? In altre parole, voglio conservare il mio codice ma eliminare il database.

In seguito vorrò anche sincronizzare il database di distribuzione (SQL Server su Azure). Ancora una volta, non mi dispiace far cadere tutti i dati - voglio solo farlo funzionare.

Fornisci tutte le istruzioni per tornare a uno stato pulito. Molto apprezzato.


TBH se vuoi semplicemente DROP DATABASEallora ....
Worthy7

Risposte:


209

Seguire i passaggi seguenti:

1) Per prima cosa vai su Esplora server in Visual Studio, controlla se le connessioni dati ".mdf" per questo progetto sono connesse, in tal caso, fai clic con il pulsante destro ed elimina.

2) Vai a Esplora soluzioni, fai clic su Mostra icona Tutti i file.

3) Vai su App_Data, fai clic destro ed elimina tutti i file ".mdf" per questo progetto.

4) Elimina la cartella Migrazioni facendo clic con il tasto destro ed elimina.

5) Vai a SQL Server Management Studio, assicurati che il DB per questo progetto non sia presente, altrimenti eliminalo.

6) Vai alla console di Gestione pacchetti in Visual Studio e digita:

  1. Enable-Migrations -Force
  2. Add-Migration init
  3. Update-Database

7) Esegui la tua applicazione

Nota: al passaggio 6, parte 3, se viene visualizzato l'errore "Impossibile allegare il file ...", è possibile che non sia stato eliminato completamente i file del database in SQL Server.


Eccellente! Questo ha funzionato, grazie! Molto utile davvero. I passaggi sono simili per ricreare il database di distribuzione (Azure SQL)?
Toby Sharp,

ciao @TobySharp, nessun problema. Se non si dispone di dati nel database, è possibile seguire questi passaggi, ma se si dispone di dati, i passaggi non sono esattamente gli stessi.
Lin

Non ho dati che devo conservare.
Toby Sharp,

3
Aggiorna, se elimini da VS (come dicono le istruzioni) e non da Windows Explorer, allora funziona. Inoltre, se non si dispone di SQL Management Studio, è possibile utilizzare Sql Object Explorer in VS per eliminare da un localdb.
Mike Ward,

3
Se ricevi l'errore "Impossibile allegare il file ...", anche se ritieni di aver eliminato tutto, prova la risposta da questo thread: stackoverflow.com/questions/13275054/…
Andy

44

Vorrei aggiungere che la risposta di Lin è corretta.

Se si elimina in modo errato l'MDF, sarà necessario correggerlo. Per fissare le connessioni sbagliate nel progetto all'MDF. Risposta breve; ricrearlo ed eliminarlo correttamente.

  1. Crea un nuovo MDF e chiamalo come il vecchio MDF, mettilo nella stessa posizione della cartella. È possibile creare un nuovo progetto e creare un nuovo mdf. Il mdf non deve corrispondere ai tuoi vecchi tavoli, perché lo avrebbero eliminato. Quindi crea o copia un vecchio nella cartella corretta.
  2. Aprilo in Esplora server [fai doppio clic sul mdf da Esplora soluzioni]
  3. Eliminalo in Esplora server
  4. Eliminalo da Esplora soluzioni
  5. run update-database -force [Usa la forza se necessario]

Fatto, goditi il ​​tuo nuovo db

AGGIORNAMENTO 11/11/14 - Lo uso sempre quando faccio un cambio db di rottura. Ho scoperto che questo è un ottimo modo per ripristinare le migrazioni al db originale:

  • Riporta il db all'originale
  • Esegui la normale migrazione per riportarla alla corrente

    1. Update-Database -TargetMigration:0 -force [Questo distruggerà tutte le tabelle e tutti i dati.]
    2. Update-Database -force [usare la forza se necessario]

1
Molto felice di aiutare ... Ho intenzione di aggiornare la mia risposta. Di recente ho trovato un modo migliore per ripristinare tutte le modifiche.
Steve Coleman,

8

Questo ha funzionato per me:

  1. Elimina il database da SQL Server Object Explorer in Visual Studio. Fare clic con il tasto destro e selezionare Elimina.
  2. Elimina i file mdf e ldf dal file system, se sono ancora lì.
  3. Ricostruisci soluzione.
  4. Avvia applicazione: il database verrà ricreato.

1
Sì, tutto quello che dovevo fare era eliminare l'MDF, aggiornare la stringa di connessione in web.config, quindi eseguire l'applicazione e registrare un nuovo account. Ha creato di nuovo tutte le tabelle nel nuovo database automagicamente.
Dan Bechard,

3

Mentre questa domanda si basa sul non preoccuparsi dei dati, a volte la manutenzione dei dati è essenziale.

In tal caso, ho scritto un elenco di passaggi su come ripristinare da incubo Entity Framework quando il database ha già tabelle con lo stesso nome qui: Come ripristinare da incubo Entity Framework - il database ha già tabelle con lo stesso nome

Apparentemente ... un moderatore ha ritenuto opportuno eliminare il mio post, quindi lo incollerò qui:

Come recuperare dall'incubo di Entity Framework: il database ha già tabelle con lo stesso nome

Descrizione : Se sei come noi quando il tuo team è nuovo di EF, finirai in uno stato in cui non puoi creare un nuovo database locale o non puoi applicare aggiornamenti al tuo database di produzione. Volete tornare in un ambiente EF pulito e poi attenervi alle basi, ma non potete. Se lo fai funzionare per la produzione, non puoi creare un db locale e se lo fai funzionare per locale, il tuo server di produzione non è sincronizzato. Infine, non si desidera eliminare i dati del server di produzione.

Sintomo : impossibile eseguire Update-Database perché sta tentando di eseguire lo script di creazione e il database ha già tabelle con lo stesso nome.

Messaggio di errore: System.Data.SqlClient.SqlException (0x80131904): esiste già un oggetto denominato '' nel database.

Contesto del problema : EF comprende dove si trova il database corrente rispetto a dove si trova il codice in base a una tabella nel database denominata dbo .__ MigrationHistory. Quando esamina gli Script di migrazione, cerca di riconsiliare dove si trovava l'ultima volta con gli script. Se non ci riesce, cerca solo di applicarli in ordine. Ciò significa che ritorna allo script di creazione iniziale e se si guarda la prima parte del comando UP, sarà la tabella di Creeate per la tabella su cui si è verificato l'errore.

Per capirlo in modo più dettagliato, consiglierei di guardare entrambi i video citati qui: https://msdn.microsoft.com/en-us/library/dn481501(v=vs.113).aspx

Soluzione : ciò che dobbiamo fare è ingannare EF nel pensare che il database corrente sia aggiornato mentre non si applicano questi comandi CreateTable. Allo stesso tempo, vogliamo ancora che esistano quei comandi in modo da poter creare nuovi database locali.

Passaggio 1: DB di produzione pulito Per prima cosa, eseguire un backup del proprio db di produzione. In SSMS, fai clic con il pulsante destro del mouse sul database, seleziona "Attività> Esporta applicazione livello dati ..." e segui le istruzioni. Aprire il database di produzione ed eliminare / eliminare la tabella dbo .__ MigrationHistory.

Passaggio 2: pulizia dell'ambiente locale Aprire la cartella delle migrazioni ed eliminarla. Presumo che tu possa riavere tutto da git se necessario.

Passaggio 3: Ricreare iniziale In Gestione pacchetti, eseguire "Enable-Migrations" (EF ti chiederà di utilizzare -ContextTypeName se hai più contesti). Esegui "Add-Migration Initial -verbose". Questo creerà lo script iniziale per creare il database da zero in base al codice corrente. Se hai avuto delle operazioni seed nel precedente Configuration.cs, copialo su across.

Step 4: Trick EF A questo punto, se avessimo eseguito Update-Database , avremmo riscontrato l'errore originale. Quindi, dobbiamo ingannare EF nel pensare che sia aggiornato, senza eseguire questi comandi. Quindi, vai al metodo Su nella migrazione iniziale che hai appena creato e commenta tutto.

Passaggio 5: Database di aggiornamento Senza codice da eseguire sul processo Up, EF creerà la tabella dbo .__ MigrationHistory con la voce corretta per dire che ha eseguito correttamente questo script. Vai e dai un'occhiata se vuoi. Ora decommenta quel codice e salva. È possibile eseguire nuovamente Update-Database se si desidera verificare che EF sia aggiornato. Non eseguirà il passaggio Up con tutti i comandi CreateTable perché pensa di averlo già fatto.

Passaggio 6: Conferma che EF è REALMENTE aggiornato Se avevi del codice a cui non erano state ancora applicate migrazioni, questo è quello che ho fatto ...

Esegui "Add-Migration MissingMigrations" Questo creerà praticamente uno script vuoto. Poiché il codice era già presente, in realtà c'erano i comandi corretti per creare queste tabelle nello script di migrazione iniziale, quindi ho appena tagliato il comando CreateTable ed equivalenti nei metodi Su e Giù.

Ora, esegui di nuovo Update-Database e guardalo eseguire il tuo nuovo script di migrazione, creando le tabelle appropriate nel database.

Passaggio 7: confermare nuovamente e confermare. Costruisci, testa, esegui. Assicurarsi che tutto sia in esecuzione, quindi eseguire il commit delle modifiche.

Passaggio 8: fai sapere al resto del tuo team come procedere. Quando la persona successiva si aggiorna, EF non saprà che cosa l'ha colpito dato che gli script eseguiti in precedenza non esistono. Ma, supponendo che i database locali possano essere spazzati via e ricreati, tutto va bene. Dovranno eliminare il loro database locale e aggiungere crearlo nuovamente da EF. Se avessero apportato modifiche locali e migrazioni in sospeso, consiglierei di creare nuovamente il loro DB sul master, passare al ramo delle funzionalità e ricreare questi script di migrazione da zero.


1

Voglio solo aggiungere alla risposta eccellente di @Lin:

5) B. Se non si dispone di SQL Management Studio, andare a "Esplora oggetti di SQL Server". Se non riesci a visualizzare il tuo db di progetto nel localdb "Esplora oggetti di SQL Server", fai clic sul pulsante "Aggiungi server SQL" per aggiungerlo manualmente all'elenco. Quindi è possibile eliminare il db dall'elenco.


Se desideri aggiungere qualcosa a una risposta, aggiungi un commento a quella risposta anziché pubblicare una nuova risposta.
Oliver,

1
Non ne ero a conoscenza. Quindi ora puoi spostare la tua risposta in un commento ed eliminare questa risposta dal momento che tecnicamente non è una (completa) risposta alla domanda :-)
Oliver

0

Una possibile soluzione molto semplice che ha funzionato per me. Dopo aver eliminato i riferimenti al database e le connessioni che trovi in ​​server / serverobject explorer, fai clic con il pulsante destro del mouse sulla cartella App_Data (non ha mostrato alcun oggetto all'interno dell'applicazione per me) e seleziona Apri. Una volta aperto metti tutto il database / ecc. file in una cartella di backup o se hai il fegato basta eliminarli. Esegui l'applicazione e dovrebbe ricreare tutto da zero.


0

La mia soluzione è più adatta per :
- cancellato il tuo file mdf
- voglio ricreare il tuo db.

Per ricreare il database è necessario aggiungere la connessione utilizzando Visual Studio.

Passaggio 1 : Vai a Esplora server aggiungi nuova connessione (o cerca un'icona Aggiungi db).

Passaggio 2 : modificare l' origine dati nel file di database di Microsoft SQL Server .

Passaggio 3 : aggiungere qualsiasi nome di database desiderato nel campo Nome file di database (preferibilmente lo stesso nome che si ha nell'attributo web.config AttachDbFilename )

Passaggio 4 : fai clic su Sfoglia e vai al punto in cui desideri che si trovi.

Passaggio 5 : nel comando di esecuzione della console del gestore pacchettiupdate-database

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.