63

이 질문에는 이미 답변이 있습니다.

이 코드 :

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을 열었으며 메타 데이터는 괜찮아 보인다.


  • 제발, 제발, 제발, 항상 스택 추적 및 내부 예외를 포함한 전체 예외를 게시하십시오. ex.ToString ()의 결과를 게시하십시오. - John Saunders
  • 나는 당신이 마음을 쓰지 않기를 바랍니다. 질문을 편집하여 형식을 수정했습니다. 코드로 포맷하려면 네 칸을 들여 써야합니다. 그렇지 않으면 코드를 선택하고 10101과 함께 버튼을 누릅니다. - John Saunders
  • 팁 고마워 - Shiraz Bhaiji

8 답변


108

문제를 찾았습니다.

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

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

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


  • & quot; 일부 경우 & quot; 같은 이름의 두 개 이상의 edmx 파일이있는 경우입니다 (예 : Model1). - alpav
  • 내 "일부 사례" 솔루션에 하나의 .edmx 파일 만있었습니다. 무슨 일이 있었는지 전혀 모르지만 끔찍했습니다. ;) - jfar
  • 네가 준 링크 때문에 내가 답을 얻었고, 그래서 너는 내 업보트를 받고있어! 나는 반나절 동안 이것을 가지고 싸웠다. res : // NameOfDLL / ... 시도했지만 성공하지 못했습니다. 그러나 마침내 res : // NameOfAssembly / ...와 작동하도록했습니다.이 경우 끝에있는 .dll을 갖고 있지 않은 어셈블리 이름을 제외하고는 같은 이름이었습니다. - Kasey Speakman
  • 귀하의 지시에 따라 연결 문자열을 수정 한 후 연결 문자열을 생성 한 후 모델의 네임 스페이스를 변경했습니다. - Ryan Eastabrook
  • 이것이 내 문제를 해결했기 때문에 투표했습니다. 감사! - l15a

44

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

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

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

어디에내선"csdl", "ssdl"및 "msl"입니다.

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

그만큼모델명부분은이름과 네임 스페이스.edmx 파일의. 그래서 네가My.DataAccess어셈블리를 만들고DataModels.edmx안에모델폴더의 전체 이름은입니다.My.DataAccess.Models.DataModels. 이 경우 메타 데이터에 "Models.DataModels. (ext)"가 있습니다.

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


  • 고맙습니다! 이것에 대한 100 가지 답변이 인터넷에서 가능하지만, 이것들 중 가장 유용한 부록입니다. 명확한 예 :DalProject.dll너는 폴더를 가지고있다.Client어느 것이Client.edmx그것에 파일. 그래서 당신은//*/Client.(csdl/ssdl/msl)//DalProject/Client.Client.(csdl/ssdl/msl) - Maverick
  • & quot; My.DataAccess & quot;와 같습니다. 필요하지 않습니다. & quot; Models.DataModels & quot; 일부 (아마도 검색된 각 어셈블리 루트 네임 스페이스에 상대적으로 작동합니다). - James Wilkins

14

가능한 여러 가지 잡기가 있습니다. 가장 일반적인 오류는 연결 문자열의이 부분에 있다고 생각합니다.

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

이것은 마술이 아닙니다. 무엇이 의미하는지 이해하면 연결 문자열을 올바르게 가져옵니다.

처음에는트리플 엑스부품. 이것은 EF 컨텍스트 클래스를 정의한 어셈블리 이름과 다른 것입니다. 보통 그것은 비슷한 것입니다.MyProject.Data. 기본값은로드 된 모든 어셈블리를 나타내는 *입니다. 특정 어셈블리 이름을 지정하는 것이 항상 좋습니다.

이제YYY부품. 그것은 리소스 이름입니다.트리플 엑스어셈블리. 대개 슬래시 대신 .edmx 파일의 상대 경로와 비슷합니다. 예 :모델 / 카탈로그-모델. 카탈로그애플리케이션에 올바른 문자열을 얻는 가장 쉬운 방법은트리플 엑스어셈블리. 그런 다음 텍스트 편집기 (나는 Total Commander의 기본 뷰어를 선호한다)에서 어셈블리 dll 파일을 열고 ".csdl"을 검색하십시오. 대개 해당 문자열이 1 회 이상 발생하지 않습니다.

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

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


  • dll에서 검색 중. 울트라 톱 팁. 감사 :) - uniquelau

0

Shiraz Bhaiji가 대답하면서 메타 데이터 = res : ///Model.csdl | res : ///Model.ssdl | res : //*/Model.msl이 그랬습니다.  그러나 모델 로캘, 네임 스페이스 및 어셈블리 이름을 기반으로 올바른 문자열을 구성하는 데 여전히 문제가있었습니다. 아주 간단한 해결책은 Visual Studio에서 .edmx 파일의 이름을 바꾸고 (원래 이름으로 바꾸고 원래 이름으로 돌아가는 것 이후에) 내 Web.config에서 문자열의 자동 새로 고침을 트리거하는 것이 었습니다


0

한 솔루션에서 세 개의 프로젝트에 동일한 문제가 있었으며 웹 사이트 프로젝트의 참조 파일에서 edmx 파일이있는 프로젝트에 대한 참조를 만들 때까지 모든 제안이 작동하지 않았습니다.


0

나는 데이터베이스를 먼저 옮겼다.데이터 모델개발 도중에 다른 프로젝트로 가난한 계획 (또는 부족)이 내 부분에 있습니다.

처음에는 하나의 프로젝트로 솔루션을 얻었습니다. 그런 다음 솔루션에 다른 프로젝트를 추가하고 데이터베이스 첫 번째를 다시 만들었습니다.데이터 모델SQL Server 데이터베이스에서.

문제를 해결하려면 -Entity Framework 엔터티 연결을 사용할 때 MetadataException 발생. 새 프로젝트에서 ConnectionString을 복사했습니다.Web.Config원래 프로젝트로Web.Config. 그러나 원래 프로젝트의 모든 참조를 새 프로젝트로 업데이트 한 후에 발생했습니다.데이터 모델계획.


0

위의 프로세스에 의해 해결되는 연결 문자열 오류 일 수도 있지만 여러 프로젝트에서 dll을 사용하는 경우 연결 문자열의 이름이 올바른지 확인하면 오류가 확실히 수정됩니다.


0

이 문제는 내.edmx한 프로젝트에서 다른 프로젝트로 데이터베이스 첫 번째 모델.

간단히 다음과 같이했습니다.

  1. 에서 연결 문자열을 삭제했습니다.app.config또는web.config
  2. 'Model.edmx'를 삭제했습니다.
  3. 모델을 프로젝트에 다시 추가하십시오.

연결된 질문


관련된 질문

최근 질문