2009-07-02 40 views
61

este código:MetadataException cuando se utiliza la entidad Entity Framework conexión

using (EntityConnection conn = new EntityConnection("name=ELSCommonEntities")) 
{ 
    conn.Open(); 
} 

me da el siguiente error:

Test method ELS.Service.Business.IntegrationTest.Base.ServiceBaseIntegrationTest.StartLoggingTestMethod threw exception: System.Data.MetadataException: Unable to load the specified metadata resource.. 

Con este seguimiento de pila:

System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.LoadResources(String assemblyName, String resourceName, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) 
System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.CreateResourceLoader(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) 
System.Data.Metadata.Edm.MetadataArtifactLoader.Create(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) 
System.Data.EntityClient.EntityConnection.SplitPaths(String paths) 
System.Data.EntityClient.EntityConnection.GetMetadataWorkspace(Boolean initializeAllCollections) 
System.Data.EntityClient.EntityConnection.InitializeMetadata(DbConnection newConnection, DbConnection originalConnection, Boolean closeOriginalConnectionOnFailure) 
System.Data.EntityClient.EntityConnection.Open() 
ELS.Service.Business.Base.ServiceBase.StartLogging(String userWindowsLogon) in C:\C-TOM\ELS-RELEASE1\ELS.Service.Business\Base\ServiceBase.cs: line 98 
ELS.Service.Business.IntegrationTest.Base.ServiceBaseIntegrationTest.StartLoggingTestMethod() in C:\C-TOM\ELS-RELEASE1\ELS.Service.Business.IntegrationTest\Base\ServiceBaseIntegrationTest.cs: line 65 

Sin embargo, este código que utiliza la misma cadena de conexión:

using (ELSCommonEntities db = new ELSCommonEntities()) 
{ 
    var res = from c in db.Logging 
       select c; 

    int i = res.Count(); 
} 

No se ha producido ningún error.

La cadena de conexión es:

<add name="ELSCommonEntities" connectionString="metadata=res://*/Common.CommonModel.csdl|res://*/Common.CommonModel.ssdl|res://*/Common.CommonModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost;Initial Catalog=els5_demo;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 

También he abierto el archivo DLL en el reflector y los metadatos se ve bien.

+4

Por favor, por favor, siempre publique la excepción completa, incluido el seguimiento de la pila y las excepciones internas. Publique los resultados de ex.ToString(). –

+3

Espero que no te importe. Edité tu pregunta para arreglar el formato. Debes sangrar con cuatro espacios para formatear como código. De lo contrario, seleccione el código y presione el botón con el 10101. –

+0

Gracias por la sugerencia –

Respuesta

105

Ha encontrado el problema.

La cadena de metadatos estándar se parece a esto:

metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl 

Y esto funciona bien en la mayoría de los casos. Sin embargo, en algunos (entre ellos el mío) Marco de la entidad se confunde y no sabe lo que DLL para mirar lo tanto, cambiar la cadena de metadatos a:.

metadata=res://nameOfDll/Model.csdl|res://nameOfDll/Model.ssdl|res://nameOfDll/Model.msl 

Y funcionará. Fue este enlace que me metió en el camino correcto:

http://itstu.blogspot.com/2008/07/to-load-specified-metadata-resource.html

pesar de que tenía el problema opuesto, no funcionaba en la prueba de la unidad, pero trabajó en el servicio.

+4

"Algunos casos" son cuando tiene más de un archivo edmx con el mismo nombre (Model1, por ejemplo). – alpav

+1

Mi "algún caso" fue con solo un archivo .edmx en la solución. No tengo idea de qué pasó, pero fue horrible. ;) – jfar

+3

El enlace que me diste me llevó a la respuesta, ¡así que estás obteniendo mi voto popular! Luché con esto por medio día. Había intentado res: // NameOfDLL/... pero sin éxito. Sin embargo, finalmente conseguí que funcionara con res: // NameOfAssembly/... En este caso, tenían el mismo nombre, excepto que el nombre del ensamblado no tenía .dll al final. –

0

Como Shiraz Bhaiji respondió, los metadatos = res: ///Model.csdl | res: ///Model.ssdl | res: //*/Model.msl era el caso. Sin embargo, todavía tenía problemas para construir la cadena adecuada en función de mi localización de modelo, espacios de nombres y nombre de ensamblado. La solución más simple fue cambiar el nombre del archivo .edmx en Visual Studio (después de cambiar el nombre y volver al nombre original), lo que provocó la actualización automática de la cadena en mi Web.config

43

Tuve el mismo mensaje de error , y el problema también era la parte de metadatos de la cadena de conexión, pero tuve que profundizar un poco para resolverlo y quería compartir esta pequeña pepita:

La cadena de metadatos está formada por tres secciones que se ven como esto:

res:// 
     (assembly)/ 
     (model name).(ext) 

Dónde ext es "CSDL", "ss dl "y" msl ".

Para la mayoría de las personas, el ensamblaje probablemente sea "*", lo que parece indicar que se buscarán todos los ensamblajes cargados (no hice una gran cantidad de pruebas de esto). Esta parte no era un problema para mí, por lo que no puedo comentar si necesita el nombre del ensamblado o el nombre del archivo (es decir, con o sin ".dll"), aunque los he visto sugeridos.

El nombre del modelo parte debe ser el nombre de espacio de nombres y de su archivo .edmx, en relación con su montaje. Así que si usted tiene un ensamblajeMy.DataAccess y se crea DataModels.edmx en una carpeta modelos, su nombre completo es My.DataAccess.Models.DataModels. En este caso, tendría "Models.DataModels. (Ext)" en sus metadatos.

Si alguna vez mueve o cambia el nombre de su archivo .edmx, tendrá que actualizar su cadena de metadatos manualmente (en mi experiencia), y recordar cambiar el espacio de nombres relativo ahorrará algunos dolores de cabeza.

+6

¡GRACIAS! Hay 100 respuestas disponibles en Internet, pero este es el apéndice más útil para cualquiera de ellos. Un claro ejemplo: En 'DalProject.dll' tiene una carpeta' Cliente' que tiene el archivo 'Client.edmx' en ella. Entonces reemplaza '// */Client. (Csdl/ssdl/msl)' con '//DalProject/Client.Client. (Csdl/ssdl/msl)' – Maverick

+0

Parece que "My.DataAccess". no es requerido; solo la parte "Models.DataModels" (quizás funcione en relación con cada espacio de nombres raíz de ensamblado buscado). –

14

Hay varias capturas posibles. Creo que el error más común es en esta parte de la cadena de conexión:

res://xxx/yyy.csdl|res://xxx/yyy.ssdl|res://xxx/yyy.msl;

Esto no es magia. Una vez que comprenda lo que significa, obtendrá la cadena de conexión correcta.

Primero el xxx parte. Eso no es más que un nombre de ensamblado donde definiste tu contexto de EF clas. Por lo general, sería algo así como MyProject.Data. El valor predeterminado es *, que significa todos los conjuntos cargados. Siempre es mejor especificar un nombre de conjunto particular.

Ahora yyy parte. Ese es un nombre de recurso en el ensamblaje xxx. Por lo general, será algo así como una ruta relativa a su archivo .edmx con puntos en lugar de barras diagonales. P.ej. Modelos/Catálogo - Models.Catalog La forma más fácil de obtener la cadena correcta para su aplicación es la construcción de la asamblea xxx. A continuación, abra el archivo dll de ensamblaje en un editor de texto (prefiero el visualizador predeterminado de Total Commander) y busque ".csdl". Por lo general, no habrá más de 1 ocurrencia de esa cadena.

Su cadena de conexión EF final puede tener este aspecto:

res://MyProject.Data/Models.Catalog.DataContext.csdl|res://MyProject.Data/Models.Catalog.DataContext.ssdl|res://MyProject.Data/Models.Catalog.DataContext.msl;

+2

Buscando en el dll. Ultra Top Tip. Gracias :) – uniquelau

0

tuve el mismo problema con tres proyectos en una solución y todas las sugerencias que no funcionó hasta que hice una referencia en el archivo de referencia del proyecto del sitio web al proyecto donde se encuentra el archivo edmx.

0

Moví mi base de datos primero DataModel a un proyecto diferente a medio camino del desarrollo. Mala planificación (o falta de) de mi parte.

Inicialmente tuve una solución con un proyecto. Luego agregué otro proyecto a la solución y recreé mi Database First DataModel del Sql Server Dataase. Para solucionar el problema: MetadataException cuando se utiliza Entity Framework Entity Connection. Copié mi ConnectionString del nuevo proyecto Web.Config en el proyecto original Web.Config.Sin embargo, esto ocurrió después de actualizar todas las referencias en el proyecto original al nuevo proyecto DataModel.

0

Puede ser solo un error de cadena de conexión, que se resuelve con el proceso anterior, pero si está utilizando el dll en varios proyectos, asegúrese de que la cadena de conexión tenga el nombre correcto.

0

Tuve este problema al mover mi primer modelo de base de datos .edmx de un proyecto a otro.

simplemente hice lo siguiente:

  1. suprimido el cadenas de conexión en el app.config o web.config
  2. suprimido el 'Model.edmx' añadido Re-
  3. el modelo para el proyecto.
Cuestiones relacionadas