MetadataException bei Verwendung von Entity Framework Entity Connection

entity-framework

Frage

Dieser Code:

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

Gibt mir den folgenden Fehler:

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

Mit folgendem Stack-Trace:

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

Dieser Code verwendet jedoch dieselbe Verbindungszeichenfolge:

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

    int i = res.Count();
}

Gibt keinen Fehler aus.

Die Verbindungszeichenfolge lautet:

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

Ich habe auch die DLL in Reflector geöffnet und die Metadaten sieht ok aus.

Akzeptierte Antwort

Das Problem gefunden.

Die Standard-Metadatenzeichenfolge sieht folgendermaßen aus:

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

Und das funktioniert in den meisten Fällen gut. In einigen (auch meinen) Entity Frameworks werden die Informationen jedoch verwirrt und wissen nicht, in welcher DLL nachzuschauen wird.

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

Und es wird funktionieren. Dieser Link hat mich auf den richtigen Weg gebracht:

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

Ich hatte zwar das gegenüberliegende Problem, arbeitete nicht im Unit-Test, arbeitete aber im Service.


Beliebte Antwort

Ich hatte die gleiche Fehlermeldung und das Problem war auch der Metadatenteil der Verbindungszeichenfolge, aber ich musste etwas tiefer graben, um es zu lösen, und wollte dieses kleine Nugget teilen:

Die Metadatenzeichenfolge besteht aus drei Abschnitten, die jeweils wie folgt aussehen:

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

Dabei ist ext "csdl", "ssdl" und "msl".

Für die meisten Leute kann die Assemblierung wahrscheinlich "*" sein, was darauf hindeutet, dass alle geladenen Assemblies durchsucht werden (ich habe dies nicht sehr oft getestet). Dieser Teil war für mich kein Problem, daher kann ich nicht kommentieren, ob Sie den Assemblynamen oder den Dateinamen (dh mit oder ohne ".dll") benötigen, obwohl ich beide Vorschläge gesehen habe.

Der Modellnamenteil sollte der Name und der Namespace Ihrer .edmx-Datei sein, relativ zu Ihrer Assembly. Wenn Sie also eine My.DataAccess Montage und Sie erstellen DataModels.edmx in einem Ordner Modelle, dessen voller Name ist My.DataAccess.Models.DataModels. In diesem Fall hätten Sie "Models.DataModels. (Ext)" in Ihren Metadaten.

Wenn Sie Ihre .edmx-Datei verschieben oder umbenennen, müssen Sie die Metadatenzeichenfolge manuell aktualisieren (nach meiner Erfahrung). Wenn Sie daran denken, den relativen Namespace zu ändern, können Sie einige Kopfschmerzen vermeiden.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum