MetadataException lors de l'utilisation de Entity Framework Entity Connection

entity-framework

Question

Ce code:

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

Me donne l'erreur suivante:

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

Avec la trace de pile suivante:

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

Cependant, ce code qui utilise la même chaîne de connexion:

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

    int i = res.Count();
}

Ne donne pas d'erreur.

La chaîne de connexion est:

<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" />

J'ai également ouvert la DLL dans le réflecteur et les métadonnées semblent bonnes.

Réponse acceptée

Trouvé le problème.

La chaîne de métadonnées standard ressemble à ceci:

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

Et cela fonctionne bien dans la plupart des cas. Cependant, dans certains (y compris le mien) Entity Framework, nous sommes confus et ne savons pas quelle dll regarder. Par conséquent, modifiez la chaîne de métadonnées en:

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

Et ça va marcher. C'est ce lien qui m'a mis sur la bonne voie:

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

Bien que j'ai eu le problème opposé, n'a pas fonctionné dans le test unitaire, mais a travaillé dans le service.


Réponse populaire

J'ai eu le même message d'erreur, et le problème était aussi la partie métadonnées de la chaîne de connexion, mais j'ai dû creuser un peu plus profondément pour le résoudre et je voulais partager cette petite pépite:

La chaîne de métadonnées est composée de trois sections, chacune ressemblant à ceci:

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

ext est "csdl", "ssdl" et "msl".

Pour la plupart des gens, l' assembly peut probablement être "*", ce qui semble indiquer que tous les assemblys chargés feront l'objet d'une recherche (je n'ai pas fait beaucoup de tests à ce sujet). Cette partie ne me posait pas problème, je ne peux donc pas vous dire si vous avez besoin du nom de l'assembly ou du nom du fichier (c'est-à-dire avec ou sans ".dll"), bien que j'ai vu les deux suggérés.

La partie du nom du modèle doit être le nom et l’espace de noms de votre fichier .edmx, par rapport à votre assemblage. Ainsi, si vous avez un assemblage My.DataAccess et que vous créez DataModels.edmx dans un dossier Modèles , son nom complet est My.DataAccess.Models.DataModels . Dans ce cas, vous auriez "Models.DataModels. (Ext)" dans vos métadonnées.

Si vous déplacez ou renommez votre fichier .edmx, vous devrez mettre à jour votre chaîne de métadonnées manuellement (selon mon expérience), et vous rappeler de modifier l'espace de noms relatif vous évitera quelques soucis.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow