7

Per la mia sorpresa, utilizzando l'inizializzatore CreateDatabaseIfNotExists contesto, la lineaCome verificare se lo schema del database corrisponde allo schema di Entity Framework?

context.Database.Initialize(true) 

non significa gettare un'eccezione se lo schema non corrisponde il mio codice primo schema.

C'è un modo per convalidare se il database corrente corrisponde al nostro schema prima, per esempio, proviamo ad accedere a un'entità, la cui tabella non esiste più nel database, e un'eccezione viene lanciata da EF?

+1

ora c'è https://github.com/reckface/EntityFramework.Verify tramite [@reckface] (https://stackoverflow.com/users/474702) per questo scopo – user326608

+1

meglio ora che mai! Peccato che non usi più EF :) –

risposta

13

È possibile chiamare CompatibleWithModel per determinare se il database corrisponde al modello. Se si imposta il parametro su true, verrà generata un'eccezione se nel database non vengono rilevati dati di modello.

bool isCompatible = context.Database.CompatibleWithModel(true); 
+1

Quale tipo se l'eccezione generata? – Jerther

+0

Ho controllato gli interni EF e sembra che NotSupportedException possa essere distrutta in caso di assenza di metadati nel database. – Alexander

+0

Come nota, ho provato a utilizzarlo su un'applicazione database-first, e può funzionare solo con database Code-first. Grazie comunque. –

6

EF non esegue il controllo incrociato dello schema del database con il modello ogni volta che si avvia l'applicazione. Invece sta cercando il modello che viene salvato nel database (__MigrationsHistory table e prima di EdmMetadata) e confronta questo modello salvato con il modello che si sta utilizzando. Se i modelli corrispondono, verrà utilizzato il database. Se i modelli non corrispondono, verrà generata un'eccezione. Se nel database non sono presenti né __MigrationHistory né la tabella EdmMetadata nel database, EF presumerà che si stia utilizzando il primo approccio di Database con DbContext e che il database corrisponda al modello. Se si desidera confrontare il database con il modello, è possibile scaricare Edmx per il modello (utilizzando EdmxWriter.WriteEdmx) e utilizzare Visual Studio ed EF Designer per ottenere Edmx dal database e confrontare le parti SSDL.

+0

"EF supporrà che tu stia utilizzando il primo approccio del database con DbContext e che il tuo database corrisponda al modello". Quindi ogni volta che la mia applicazione inizia devo verificare se tutte le tabelle e tutte le colonne esistono nel database? –

+1

Se non si modifica né il modello né il database e sono stati abbinati prima, probabilmente non è necessario farlo. Penso che a prescindere dalla tecnologia di accesso che utilizzi, questo problema esiste e il processo di sviluppo dovrebbe occuparsene. Riscoprire il database in fase di runtime mi sembra un approccio sbagliato. – Pawel

+1

@Pawel non ti piacciono i prodotti spediti! Il cliente installa il prodotto 1.0, quindi lo aggiorna che richiede una modifica del DB. Il cliente installa quindi un nuovo codice ma non riesce (per qualsiasi motivo) ad aggiornare correttamente lo schema, quindi esegue il prodotto e si verifica una brutta eccezione quando il codice tenta di leggere dalle colonne mancanti. Quindi è meglio controllare prima, o almeno tentare qualche convalida in modo da poter apparire un messaggio di errore migliore e quindi uscire. – gbjbaanb

Problemi correlati