Errore del solo codice struttura quadro: il modello di backup del contesto è stato modificato dopo la creazione del database

Ho creato un POCO “Solo codice” da utilizzare su un database esistente utilizzando Entity Framework 4 e CTP4. Quando eseguo una query ottengo l’errore

Il modello che supporta il contesto ‘xyzContext’ è cambiato da quando è stato creato il database. Eliminare o aggiornare manualmente il database o chiamare Database.SetInitializer con un’istanza IDatabaseInitializer. Ad esempio, la strategia RecreateDatabaseIfModelChanges eliminerà e ricreerà automaticamente il database e facoltativamente lo seminerà con nuovi dati.

Non sono chiaro perché questo sta accadendo o cosa posso cambiare. Ho semplicemente creato il POCO, definito un semplice DbContext, apportato alcune modifiche e quindi ho provato a eseguire una query semplice. Dal momento che sto usando “Solo codice”, non sono a conoscenza di eventuali impostazioni di configurazione che devono essere fatte. E certamente non voglio ricreare o cancellare il database poiché si tratta di un database esistente.

Grazie per qualsiasi idea

Ho trovato la risposta nei commenti su questo post sul blog di Scott Guthrie.

http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx

Per coloro che stanno vedendo questa eccezione:

“Il modello che supportava il contesto” Produzione “è stato modificato da quando è stato creato il database. Eliminare o aggiornare manualmente il database oppure chiamare Database.SetInitializer con un’istanza IDatabaseInitializer.”

Ecco cosa sta succedendo e cosa fare al riguardo:

Quando un modello viene creato per la prima volta, eseguiamo un DatabaseInitializer per fare cose come creare il database se non c’è o aggiungere i dati di seed. 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). I database esistenti non avranno la tabella EdmMetadata e quindi non avranno l’hash … e l’implementazione oggi verrà lanciata se manca quella tabella. Lavoreremo su come cambiare questo comportamento prima di spedire la versione fial dal momento che è l’impostazione predefinita. Fino ad allora, i database esistenti non hanno generalmente bisogno di alcun inizializzatore del database in modo che possa essere distriggersto per il proprio tipo di contesto chiamando:

Database.SetInitializer(null); 

Questo è un bug in CTP4 per l’utilizzo di EF con database preesistenti.

Puoi risolvere il problema chiamando:

 Database.SetInitializer(null); 

nel metodo Application_Start di Global.asax

Ho commentato in precedenza e ha funzionato nel momento in cui ho appena giocato con EF5 per familiarizzare con il suo funzionamento. Ora sto scrivendo il codice “effettivo” e mi sono allontanato dall’impostare un inizializzatore del database per il contesto nel codice a causa di un’architettura che ho scelto di utilizzare MEF per creare un’istanza di DbContext e iniettare tutte le dipendenze di configurazione come parti componibili.

Così di nuovo ho subito incontrato l’errore descritto sopra ma questa volta ho scelto di risolverlo usando le voci del file di configurazione come di seguito.

           

Quindi impostando disableDatabaseInitialization = “true” nella sezione del file di configurazione per entityFramework puoi superare l’errore descritto sopra e poiché non è nel codice uno dei vantaggi è la possibilità di “più facilmente” utilizzare builder / factory astratti per creare il contesto.

Tutto quello che dovevo fare era eliminare la tabella __MigrationHistory .

Contesto:

Ho ricevuto questo errore quando ho cambiato il nome di una tabella. Dopo aver aggiunto l’annotazione [Table("NewTableName")] a uno dei miei modelli, Entity Framework ha generato una tabella __MigrationHistory .

Ho avuto lo stesso problema: aggiungere nuovamente la migrazione e aggiornare il database non ha funzionato e nessuna delle risposte sopra sembrava corretta. Poi l’ispirazione mi ha colpito – sto usando più livelli (un web, un dato e un business). Il livello Web non ha mai generato questa eccezione: era il livello aziendale (che ho impostato come applicazione console per test e debug). Risulta che il livello aziendale non stava usando la giusta stringa di connessione per ottenere il db e creare il contesto. Così ho aggiunto la stringa di connessione alla configurazione dell’app e viola funziona. Mettetelo qui per gli altri che potrebbero incontrare lo stesso problema.