이 질문에는 이미 답변이 있습니다.
이 코드 :
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="Data Source=localhost;Initial Catalog=els5_demo;Integrated Security=True;MultipleActiveResultSets=True"" 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)
어디에내선"csdl", "ssdl"및 "msl"입니다.
대부분의 사람들에게,어셈블리아마도 "*"일 수 있습니다. 이는로드 된 모든 어셈블리가 검색 될 것임을 나타냅니다 (나는이 테스트를 거치지 않았습니다). 이 부분은 저에게 큰 문제가 아니므로 어셈블리 이름이나 파일 이름 (예 : ".dll"과 함께 또는없이)을 필요로하는지 여부는 언급 할 수 없습니다.
그만큼모델명부분은이름과 네임 스페이스.edmx 파일의. 그래서 네가My.DataAccess어셈블리를 만들고DataModels.edmx안에모델폴더의 전체 이름은입니다.My.DataAccess.Models.DataModels. 이 경우 메타 데이터에 "Models.DataModels. (ext)"가 있습니다.
혹시 .edmx 파일을 옮기거나 이름을 바꾼다면 수동으로 (경험상) 메타 데이터 문자열을 업데이트해야하며, 상대 네임 스페이스를 변경하면 몇 가지 어려움을 줄일 수 있습니다.
DalProject.dll
너는 폴더를 가지고있다.Client
어느 것이Client.edmx
그것에 파일. 그래서 당신은//*/Client.(csdl/ssdl/msl)
와//DalProject/Client.Client.(csdl/ssdl/msl)
- Maverick
가능한 여러 가지 잡기가 있습니다. 가장 일반적인 오류는 연결 문자열의이 부분에 있다고 생각합니다.
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;
Shiraz Bhaiji가 대답하면서 메타 데이터 = res : ///Model.csdl | res : ///Model.ssdl | res : //*/Model.msl이 그랬습니다. 그러나 모델 로캘, 네임 스페이스 및 어셈블리 이름을 기반으로 올바른 문자열을 구성하는 데 여전히 문제가있었습니다. 아주 간단한 해결책은 Visual Studio에서 .edmx 파일의 이름을 바꾸고 (원래 이름으로 바꾸고 원래 이름으로 돌아가는 것 이후에) 내 Web.config에서 문자열의 자동 새로 고침을 트리거하는 것이 었습니다
한 솔루션에서 세 개의 프로젝트에 동일한 문제가 있었으며 웹 사이트 프로젝트의 참조 파일에서 edmx 파일이있는 프로젝트에 대한 참조를 만들 때까지 모든 제안이 작동하지 않았습니다.
나는 데이터베이스를 먼저 옮겼다.데이터 모델개발 도중에 다른 프로젝트로 가난한 계획 (또는 부족)이 내 부분에 있습니다.
처음에는 하나의 프로젝트로 솔루션을 얻었습니다. 그런 다음 솔루션에 다른 프로젝트를 추가하고 데이터베이스 첫 번째를 다시 만들었습니다.데이터 모델SQL Server 데이터베이스에서.
문제를 해결하려면 -Entity Framework 엔터티 연결을 사용할 때 MetadataException 발생. 새 프로젝트에서 ConnectionString을 복사했습니다.Web.Config원래 프로젝트로Web.Config. 그러나 원래 프로젝트의 모든 참조를 새 프로젝트로 업데이트 한 후에 발생했습니다.데이터 모델계획.
위의 프로세스에 의해 해결되는 연결 문자열 오류 일 수도 있지만 여러 프로젝트에서 dll을 사용하는 경우 연결 문자열의 이름이 올바른지 확인하면 오류가 확실히 수정됩니다.
이 문제는 내.edmx
한 프로젝트에서 다른 프로젝트로 데이터베이스 첫 번째 모델.
간단히 다음과 같이했습니다.
app.config
또는web.config