Entity Framework 엔터티 연결을 사용할 때 MetadataException 발생

entity-framework

문제

이 코드 :

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

다음 오류가 발생합니다.

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

다음 스택 추적 :

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

그러나 동일한 연결 문자열을 사용하는이 코드는 다음과 같습니다.

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

    int i = res.Count();
}

오류가 발생하지 않습니다.

연결 문자열은 다음과 같습니다.

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

나는 또한 reflector에 dll을 열었으며 메타 데이터는 괜찮아 보인다.

수락 된 답변

문제를 찾았습니다.

표준 메타 데이터 문자열은 다음과 같습니다.

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

그리고 이것은 대부분의 경우에 잘 작동합니다. 그러나 일부 (광산 포함)에서 Entity Framework은 혼란스럽고 어떤 DLL을 볼지 모르기 때문에 메타 데이터 문자열을 다음과 같이 변경하십시오.

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

그리고 그것은 효과가 있습니다. 이 링크를 통해 올바른 길을 찾아 냈습니다.

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

나는 문제가 있었지만 단위 테스트에서 일하지는 않았지만 근무했다.


인기 답변

나는 동일한 오류 메시지가 있었고 문제는 연결 문자열의 메타 데이터 부분이기도하지만 문제를 해결하기 위해 조금 더 자세히 조사해야했고이 작은 너겟을 공유하려고했습니다.

메타 데이터 문자열은 다음과 같은 세 개의 섹션으로 구성됩니다.

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

여기서 ext 는 "csdl", "ssdl"및 "msl"입니다.

대부분의 사람들에게 어셈블리 는 아마도 "*"일 수 있습니다. 이것은로드 된 어셈블리가 검색 될 것임을 나타냅니다. (나는 이것에 대해 많은 테스트를하지 않았습니다.) 이 부분은 저에게 문제가 아니므로 어셈블리 이름이나 파일 이름 (예 : ".dll"과 함께 또는 ".dll")이 필요한지 여부에 대해서는 언급 할 수 없습니다.

모델 이름 부분은 어셈블리와 관련된 .edmx 파일의 이름과 네임 스페이스 여야합니다. 따라서 My.DataAccess 어셈블리가 있고 모델 폴더에 DataModels.edmx 를 만들면 전체 이름은 My.DataAccess.Models.DataModels됩니다 . 이 경우 메타 데이터에 "Models.DataModels. (ext)"가 있어야합니다.

혹시 .edmx 파일을 옮기거나 이름을 바꾼다면 수동으로 (내 경험으로) 메타 데이터 문자열을 업데이트해야하며, 상대 네임 스페이스를 변경하면 몇 가지 어려움을 줄일 수 있습니다.



Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.