2011-12-25 9 views
13

Estoy intentando utilizar el patrón EF 4 Code First. Mi código de inicialización es el siguiente:EF 4 Primero el código: No se puede verificar la compatibilidad del modelo porque el tipo EdmMetadata no se incluyó en el modelo

Crear un generador de modelos:

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

    //add entity classes about 12 of them 

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

Crear sesión:

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; 
} 

Esto funciona cuando corro el código por primera vez. Sin embargo, cuando se ejecuta en segundo tiempo y se trata de añadir un objeto utilizando context.Add(myEntity) consigo siguiente excepción:

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. 

He intentado quitar siguiente línea:

builder.Conventions.Remove<IncludeMetadataConvention>(); 

pero todavía consigo el error.

Respuesta

30

bien se siente un poco tonto, pero el verdadero culpable era siguiente declaración:

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

Parece que DropCreateDatabaseIfModelChanges no es compatible con Code First aproximación o es alguna otra mystry que no entiendo (todavía).

+22

Es compatible.El problema es que la primera vez que lo crea, no tiene una tabla para rastrear los cambios del modelo, por lo tanto, se queja. Una vez que EF crea la base de datos por primera vez, puede cambiar su estrategia de inicialización a la que era. –

4

La eliminación de IncludeMetadataConvention significa que el inicializador no puede saber cuándo cambia el modelo. No será útil agregarlo tampoco porque solo crea la tabla de metadatos en la creación de db, que obviamente no existirá para bases de datos o bases de datos preexistentes que se crearon con la convención deshabilitada.

solución es dejar caer la base de datos y permitiendo la convención, o deshabilitar la inicialización y actualización de la base de datos de otra manera (migraciones manuales o EF)

0

Si usted está recibiendo este error en VS 2012 y está ejecutando en modo de depuración utilizando IIS Express, intente cambiar a Visual Studio Development Server.

Estaba obteniendo el mismo error, en una aplicación asp.net mvc 4 de primer código, usando Visual Studio 2012 en la máquina Windows 7, tocando SQL Server LocalDb (el servidor, no * .mdf), ejecutándose en mi local host en modo de depuración.

Mi inicializador está marcado con el atributo DropCreateDatabaseIfModelChanges, y estoy llamando a Database.Initialize en Global.ascx.cs Application_Start. Si la base de datos se descarta y vuelve a crear, ¿cómo diablos podría quejarse de una tabla de migración faltante? Esto fue especialmente emocionante porque configuré otra aplicación web con el mismo enfoque y funcionó a la perfección.

Incluso soltar manualmente la base de datos antes de ejecutar la aplicación no solucionó el problema.

Comparando la aplicación "buena" con la "mala", la única diferencia fue la elección de los servidores web. La "buena" aplicación utilizó Visual Studio Development Server; el "malo" usaba IIS Express.

¡Cambié la aplicación "mala" a Visual Studio Development Server y el error desapareció!

No tengo tiempo para profundizar en el "por qué" en este momento, pero aparentemente IIS Express almacena algo en caché.

Cuestiones relacionadas