2011-11-23 14 views
6

ho una piccola applicazione MVC 3 utilizzando Entity Framework Codice primo e utilizzare questa stringa di connessione per il modello:Entity Framework primo codice e stringhe di connessione

data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|Journal.mdf;User Instance=true;Database=MyJournal 

Quando faccio una modifica al modello (ad esempio aggiungere una proprietà), ottengo come previsto

Il modello di backup del contesto "JournalContext" è stato modificato da quando è stato creato il database.

Quindi, essendo in modalità sviluppo, vado avanti e cancello Journal.mdf e Journal.ldf.

Ora, quando ho eseguire nuovamente l'applicazione, ottengo

Impossibile aprire il database "MyJournal" richiesto dall'account di accesso. Il login non è riuscito.

Se cambio il mio stringa di connessione per

data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|Journal.mdf;User Instance=true;Database=MyJournal2 

(cambiato il parametro Database= aggiungendo '2')

è creato Journal.mdf e l'applicazione funziona di nuovo. Se apporto una serie di modifiche e tento di "riciclare" nuovamente il nome del database, viene visualizzato l'errore "Impossibile aprire".

Perché devo fornire un nome di database univoco ogni volta che modifico il modello e come posso "cancellare" i nomi precedenti?

+0

Si sta riavviando l'applicazione dopo aver eliminato il database? – StriplingWarrior

+0

@StriplingWarrior: Sì, lo sono. Ottengo l'errore dopo aver riavviato l'app. –

risposta

6

Non è necessario un nome di database univoco ogni volta. Quando un modello viene creato per la prima volta, esegue un DatabaseInitializer per fare cose come creare il database se non è presente o aggiungere i dati seme. Il DatabaseInitializer predefinito tenta di confrontare lo schema del database necessario per utilizzare il modello con un hash dello schema memorizzato in una tabella EdmMetadata che viene creata con un database (quando Code First è quello che crea il database). Se il confronto dell'hash è diverso, genera quell'errore.

Ovviamente se si modifica la stringa di connessione, verrà creato un database completamente nuovo denominato "MyJournal2".

I modi per aggirare questo sono eliminare la tabella EdmMetadata ed eseguire nuovamente l'inizializzatore. Puoi farlo andando nella finestra Esplora Database in Visual Studio e collegandoti al tuo database, quindi andando a Tabelle dove troverai la tabella EdmMetadata, facendo clic con il tasto destro su di essa e selezionando Elimina.

alternativa messo

DbDatabase.SetInitializer(new DropCreateDatabaseIfModelChanges<dbType>()); 

nel metodo Application_Start in Global.asax.cs. Questo eliminerà il database e lo ricreerà ogni volta che lo schema cambia.

Vedere this video on pluralsight per ulteriori dettagli, in particolare la sezione 'Quando le classi cambiano'.

Controllare anche questo collegamento per DropCreateDatabaseIfModelChanges. Ti informa su cosa succede realmente e su come seminare il database, se necessario, creando una classe derivata.

+0

Perché ottengo l'errore "permesso negato" quando elimino il file .mdf? Dove si trova la tabella EdmMadadata se non nel file .mdf eliminato? –

+0

Ho aggiornato la mia risposta su come eliminare la tabella EdmMetadata. Ti consiglio vivamente di guardare il video a cui ti ho collegato, ti dice tutto ciò che devi sapere. Si potrebbe ottenere un errore di "autorizzazione negata" per diversi motivi, uno dei quali è che il server Web è ancora in esecuzione e accede a quel database. – link664

+0

E sì, avrei assunto che se cancellassi il file .mdf, il database stesso avrebbe dovuto essere rimosso, inclusa la tabella EdmMetadata. Come stai cancellando il database? Attraverso un gestore SQL Express? – link664

Problemi correlati