2011-12-25 10 views
13

Sto provando a utilizzare il modello EF 4 Code First. Il mio codice di inizializzazione è la seguente:Codice EF 4 Primo: la compatibilità del modello non può essere verificata perché il tipo EdmMetadata non è stato incluso nel modello

Crea Model Builder:

private static DbModelBuilder CreateModelBuild() 
{ 
    var builder = new DbModelBuilder(); 

    //add entity classes about 12 of them 

    builder.Conventions.Remove<IncludeMetadataConvention>(); 
    return builder; 
} 

Creare sessione:

private bool BuildSqlServerSession(DbModelBuilder builder) 
{ 
    var model = 
    builder.Build(new SqlConnection(@"connection string")); 
    var cm = model.Compile(); 
    var context = new LittlePOSContext(cm); 
    var dbExists = context.Database.Exists(); 
    _session = new EFSession(context); 
    return dbExists; 
} 

Questo funziona quando si esegue il codice per la prima volta. Ma se in esecuzione su seconda volta e cercando di aggiungere un oggetto utilizzando context.Add(myEntity) ottengo seguente eccezione:

Model compatibility cannot be checked because the EdmMetadata type was not 
included in the model. Ensure that IncludeMetadataConvention has been added 
to the DbModelBuilder conventions. 

Ho provato a rimuovere seguente riga:

builder.Conventions.Remove<IncludeMetadataConvention>(); 

ma ho ancora ottenere l'errore.

risposta

30

Beh ci si sente un po 'sciocco, ma il vero colpevole era seguente dichiarazione:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>()); 

Sembra che DropCreateDatabaseIfModelChanges non è compatibile con Code First approccio o si tratta di qualche altra mystry che non capisco (ancora).

+22

È compatibile.Il problema è che la prima volta che lo crei, non ha una tabella per il monitoraggio delle modifiche del modello, quindi si lamenta. Una volta che il database viene creato da EF la prima volta, puoi cambiare la tua strategia di inizializzazione in quello che era. –

4

La rimozione di IncludeMetadataConvention indica che l'inizializzatore non è in grado di indicare quando il modello cambia. Aggiungerlo nuovamente non sarà di aiuto perché crea solo la tabella dei metadati sulla creazione di db, che ovviamente non esisterà per database o database preesistenti creati con la convenzione disabilitata.

Solution è far cadere il database e consentendo la convenzione, o disabilitando l'inizializzatore e l'aggiornamento del database in un altro modo (migrazioni manuali o EF)

0

Se hai trovato questo errore in VS 2012 e in esecuzione in modalità di debug usando IIS Express, prova a passare a Visual Studio Development Server.

Stavo ottenendo lo stesso errore, in un'applicazione codice prima asp.net mvc 4, utilizzando Visual Studio 2012 su computer Windows 7, premendo SQL Server LocalDb (il server, no * .mdf), in esecuzione sul mio locale host in modalità debug.

Il mio inizializzatore è contrassegnato con l'attributo DropCreateDatabaseIfModelChanges e sto chiamando Database.Initialize in Global.ascx.cs Application_Start. Se il database viene eliminato e ricreato, come diavolo potrebbe lamentarsi di una tabella di migrazione mancante? Questo è stato particolarmente agguerrito perché avrei creato un'altra applicazione web usando lo stesso approccio e funzionava perfettamente.

Anche il rilascio manuale del database prima di eseguire l'app non ha risolto il problema.

Confrontando l'app "buona" con l'app "cattiva", l'unica differenza era la scelta dei server web. L'app "buona" utilizzava Visual Studio Development Server; il "cattivo" usato IIS Express.

Ho cambiato l'app "cattiva" in Visual Studio Development Server e l'errore è scomparso!

Non ho tempo di scavare nel "perché" in questo momento, ma a quanto pare qualcosa di errato viene memorizzato nella cache da IIS Express.

Problemi correlati