2010-02-28 19 views
36

He encontrado una excepción cuando uso Entity Framework 4.0 RC. Mi modelo Entity Framework está encapsulado en un ensamblado privado cuyo nombre es Procurement.EFDataProvider y mis clases POCO están dentro de otro ensamblado Procurement.Core La relación entre Core (Business Logic) y EFDataProvider (Data Access) es con una fábrica denominada DataProviderNo se ha podido encontrar la información de correspondencia y metadatos para EntityType Error

así que cuando intento crear un ObjectSet

objectSet = ObjectContext.CreateObjectSet<TEntity>(); 

me aparece un error:

Mapping and metadata information could not be found for EntityType 'Procurement.Core.Entities.OrganizationChart'.

+2

Habiendo golpeado mi cabeza contra esto esta mañana, creo que la solución más simple podría ser utilizar la plantilla de POCO T4 para generarlos en su lugar: http://blogs.msdn.com/b/adonet/archive/2010/01/ 25/walkthrough-poco-template-for-the-entity-framework.aspx Me llevó bastante trabajo averiguar esto, y no fue trivial para mí encontrarlo en Google una vez que lo supe: -/ – Rup

+0

@Rup: he descargado esto y lo estoy usando ahora. – IAbstract

Respuesta

58

Para cualquier otra persona que trata con el error, creo que vale la pena mencionar algunos de los escenarios que he encontrado que causa este (muy poco útil) error:

  • propiedades mal escritas (mayúsculas y minúsculas!)
  • propiedades que faltan en la clase POCO
  • desajustes Tipo entre la POCO y de tipo entidad (por ejemplo, int en lugar de largo)
  • Enums en la POCO (EF doesn 'support enums en este momento, como yo lo entiendo)

Puede haber otras causas también.

HTH

+0

Gracias por estos consejos: un gran ahorro de tiempo. – Stuart

+1

Muy útil. En mi caso, agregué una propiedad a la entidad sin actualizar la clase POCO. Gracias- –

+0

Solo una palabra de advertencia para cualquiera que vaya a intentar POCO/T4, si necesita modificar los objetos después de que se generan, debe hacerlo a nivel de plantilla. Esto me mató porque no tengo tiempo para resolverlo ahora mismo. Esto es solo un FYI. De lo contrario, es bastante limpio. – dyslexicanaboko

12

Esto es probablemente debido a que EF no puede encontrar el información de mapeo incorporado. Dentro de la cadena de conexión es probable que tenga algo así como su:

metadata=res://*/Models.MyModels.csdl|...etc 

Que * es un comodín, diciendo al objeto de contexto para tratar de encontrar la información de asignación incorporado desde, creo, el escaneo de todos los ensamblados cargados. Si el ensamblaje no está cargado, EF no lo encontrará.

Lo que debe hacer es proporcionar la cadena de conexión con más información sobre dónde está incrustada la información de su asignación. Cambiar el * al nombre de ensamblado específico de su código de correspondencia:

metadata=res://Procurement.EFDataProvider/Models.MyModels.csdl 

Si eso no funciona, encontrar la Asamblea y directamente cargarlo en su ObjectContext usando:

ObjectContext.Metadataworkspace.LoadFromAssembly(); 
+0

Esto ayudó. En mi caso, he cambiado el nombre de una clase y la cadena de res no refleja ese cambio. –

1

Sólo comprobar la ortografía propiedad con el modelar

2

que estaba recibiendo este error porque no tenía más de edmx archivo en el mismo conjunto con el uso adecuado de los espacios de nombres personalizados.

Esto es lo que se dice sobre la excepción en System.Data.Objects.ObjectContext

// Excepciones:

// System.InvalidOperationException: 
    //  When the System.Data.Metadata.Edm.EntitySet from entitySetName 
    //  does not match the System.Data.Metadata.Edm.EntitySet of the object’s 
    //  System.Data.EntityKey. 
    // -or- 
    //  When the System.Data.Objects.ObjectContext.DefaultContainerName 
    //  property is not set on the System.Data.Objects.ObjectContext and 
    //  the name is not qualified as part of the entitySetName parameter. 
    // -or- 
    //  When the specified type belongs to more than one entity set. 
2

También he visto que cuando la cadena de conexión no está especificado en el archivo de configuración.

1

Puede haber otra razón. También tiré de mi cabello por una noche.

Me di cuenta de que hay algún desorden en las referencias en la solución. En mi proyecto, el edmx pertenece a un proyecto llamado DataAccess.Dll. Pero no tengo referencia de mi exe. Desde mi exe tengo una referencia a otro proyecto llamado Business.Dll, y este proyecto tiene una referencia y una ubicación anterior para el DataAccess.DLL.

Haga la siguiente prueba para ver si usted tiene tal problema:

  1. Abrir el director bin de su proyecto EXE y mantenerlo visible.
  2. Crea la solución.
  3. El primer proyecto que se construirá es el proyecto de acceso a datos, y puede ver en la carpeta bin la hora actual como su fecha de modificación.
  4. Mientras se crean otros proyectos, verá que la fecha de modificación del proyecto de DataAccess se cambió a una anterior.

Debe verificar sus referencias y asegurarse de que se refieren a las ubicaciones de actualización de sus dlls.

0

error noob, pero tuve el error cuando mi acceso a la base de datos era con un nombre de usuario y contraseña de solo lectura. Espero que mis errores ayuden a otros.

0

Tuve un problema similar. Ya tenía un archivo EDMX para una base de datos usando clases POCO y un objeto Contexto que escribí yo mismo. Cuando agregué un segundo EDMX para una base de datos diferente, utilicé la plantilla POCO T4 y luego ni EDMX funcionó y arrojó el error que mencionaste. Para resolverlo deseché mi POCO y Contexto personalizado y usé solo la Plantilla T4 y todo funcionó bien nuevamente.

0

Tuve un problema donde agregué algunas columnas a una tabla.

En las asignaciones de tabla, he cambiado el nombre de los nombres de las columnas.

Aunque había ejecutado 'Transformar todas las plantillas' y reconstruí la aplicación, todavía tengo el 'El tipo de metadatos asociado para el tipo <> contiene las siguientes propiedades desconocidas o campos <>' error.

La clase para esta tabla en Domain.Poco.tt era correcta, pero encontré el archivo class.Metadata.cs correspondiente en Domain.Poco.MetaData.tt no se había actualizado, y tenía las nuevas columnas con los nombres originales - No los nuevos que había especificado en Table Mapping.

¿Solución? Acabo de eliminar la clase de metadatos ofensiva y volví a ejecutar 'Transformar todas las plantillas' y se volvió a crear correctamente, con los nombres correctos de columna/función.

0

En mi caso, era esencialmente el mismo problema, el mapeo no era exactamente como se esperaba. Lo que me sucedió fue que había movido una propiedad en una "herencia Table Per Hierarchy" de una de las subclases a la clase base y olvidé actualizar el modelo.

Tengo un POCO personalizado y al copiar el archivo edmx a un nuevo proyecto en blanco, dejo que genere automáticamente las entidades y luego las comparo con lo que me ayudó a encontrar la diferencia.

0

Mi problema es que he editado la plantilla T4 para excluir el campo de replicación llamado "msrepl_tran_version". Esto causó que la base de datos no coincidiera con las clases generadas, lo que puede causar este mensaje de error. Solo asegúrate de que tu base de datos y tus clases coincidan.

2

Otro posible problema es, si está utilizando código de primer y el tipo de entidad que se define en un ensamblado independiente a donde el contexto es definir y no se ha añadido ningún mapeos personalizados con el método OnModelCreating(DbModelBuild modelBuilder), entonces EF parece ignorar las anotaciones de datos.

Solución:

Añadir modelBuilder.Entity<YourEntityType>(); al método OnModelCreating(DbModelBuild modelBuilder).

Related post.

+0

¡Usted, señor, es un héroe! –

Cuestiones relacionadas