66 votes

MetadataException lors de l'utilisation de Entity Framework Entity Connection

Ce code:

using (EntityConnection conn = new EntityConnection("name=ELSCommonEntities"))

{
  conn.Open();
}

Me donne l'erreur suivante:

La méthode d'essai ELS.Service.D'affaires.IntegrationTest.De la Base.ServiceBaseIntegrationTest.StartLoggingTestMethod jeta de l'exception: System.Les données.MetadataException: Impossible de charger les métadonnées définies ressource..

À la suite de trace de la pile:

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

Toutefois, 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 une 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 aussi ouvert la dll dans le réflecteur et les métadonnées semble ok.

Merci

Shiraz

114voto

Shiraz Bhaiji Points 34901

Trouvé le problème.

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

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

Et cela fonctionne bien dans la plupart des cas. Toutefois, dans certains (dont le mien) Entity Framework obtenir confus et ne sait pas la dll à regarder dans. Par conséquent, modifier les métadonnées de la chaîne:

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

Et il va fonctionner. C'était 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 l'oppos problème, n'a pas de travail dans l'unité de test, mais il a travaillé dans le service.

45voto

Ian Yates Points 236

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

Les métadonnées de la chaîne est composée de trois sections, chaque ressembler à ceci:

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

Où l' ext est "csdl", "lsed", et "msl".

Pour la plupart des gens, l'assemblée peut probablement être "*", ce qui semble indiquer que tous les chargés assemblées seront recherchés (je n'ai pas fait une énorme quantité de tests de cela). Cette partie n'était pas un problème pour moi, donc je ne peux pas commenter si vous avez besoin du nom de l'assembly ou un nom de fichier (c'est à dire avec ou sans ".dll"), même si j'ai vu les deux proposées.

Le nom du modèle de la partie devrait être le nom et l'espace de noms de votre .fichier edmx, par rapport à votre assemblée. Donc, si vous avez un Mon.DataAccess de l'assemblée et de vous créer DataModels.edmx dans un des Modèles de dossier, son nom complet est Mon.DataAccess.Modèles.DataModels. Dans ce cas, vous disposez de Modèles.DataModels.(ext)" dans vos métadonnées.

Si jamais vous déplacez ou renommez vos .fichier edmx, vous devrez mettre à jour vos métadonnées chaîne manuellement (dans mon expérience), et le souvenir de changer l'espace de noms par rapport permettra d'économiser un peu de maux de tête.

14voto

HANiS Points 56

Il y a plusieurs prises. Je pense que l'erreur la plus commune est dans cette partie de la chaîne de connexion:

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

Ce n'est pas de la magie. Une fois que vous comprenez qu'est-ce que signifie que vous obtiendrez la chaîne de connexion à droite.

D'abord le xxx partie. Ce n'est rien d'autre qu'un assemblage nom de l'endroit où vous vous avez défini EF contexte clas. Habituellement, il serait quelque chose comme MyProject.Les données. La valeur par défaut est * ce qui est synonyme de tous les assemblys chargés. Il est toujours préférable de spécifier un nom d'assembly.

Maintenant, le yyy partie. C'est un nom de ressource dans le xxxassemblée. Il sera généralement quelque chose comme un chemin d'accès relatif à la votre .fichier edmx avec des points à la place des barres obliques. E. g. Modèles/Catalogue - Des Modèles.Catalogue La meilleure façon d'obtenir la chaîne appropriée pour votre application est de construire le xxx assemblée. Ensuite, ouvrez l'assemblée fichier dll dans un éditeur de texte (je préfère le Total commander la visionneuse par défaut) et de la recherche pour ".csdl". Habituellement, il n'y aura pas plus de 1 occurence de cette chaîne.

Votre final EF chaîne de connexion peut ressembler à ceci:

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

2voto

Paweł Forys Points 60

Comme Shiraz Bhaiji a répondu, le méta-donnée = res: ///Model.csdl | res: ///Model.ssdl | res: //*/Model.msl était le cas. Cependant, je rencontrais toujours des problèmes pour construire la chaîne appropriée en fonction de ma localisation de modèle, de mes espaces de noms et de mon nom d'assemblage. La solution très simple consistait à renommer le fichier .edmx dans Visual Studio (après avoir renommé et récupéré le nom d'origine), ce qui a déclenché l'actualisation automatique de la chaîne dans mon fichier Web.config.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X