MetadataException : 지정된 메타 데이터 리소스를로드 할 수 없습니다


681

갑자기 나는 MetadataException생성 된 ObjectContext클래스 를 인스턴스화 하는 것을 계속하고 있습니다. App.Config의 연결 문자열이 올바르게 보입니다. 마지막으로 작동 한 이후 변경되지 않았습니다. 기본 데이터베이스에서 새 모델 (edmx-file)을 변경없이 재생성하려고 시도했습니다.

누구든지 아이디어가 있습니까?

추가 세부 정보 : 속성을 변경하지 않았으며 출력 어셈블리의 이름을 변경하지 않았으며 어셈블리에 EDMX를 포함시키지 않았습니다. 나는 돌아올 때까지 일을 마치고 10 시간을 기다렸다. 그리고 더 이상 작동하지 않았습니다.

EDMX를 다시 만들어 보았습니다. 프로젝트를 다시 작성하려고했습니다. 심지어 처음부터 데이터베이스를 다시 만들려고했습니다. 운이 없어요.


14
조회수가 2 만 회가 넘는 특정 제품에 대해 궁금한 점이 있으면 제품이 사용자가 기대하는 방식으로 작동하지 않는 것입니다. Microsoft가이 문제를 해결하고 싶습니다. 여기에 시간이 있다면 그들에게 제안을 제공하는 링크가 있습니다 : visualstudio.uservoice.com/forums/121579-visual-studio .
Tony L.

db-layer 프로젝트에서 복사 한 연결 문자열을 교체하여 문제를 해결했습니다.
Hardik

답변:


856

이는 애플리케이션이 EDMX를로드 할 수 없음을 의미합니다. 이 문제를 일으킬 수있는 몇 가지가 있습니다.

  • 모델의 MetadataArtifactProcessing 속성을 출력 디렉터리로 복사로 변경했을 수 있습니다.
  • 연결 문자열이 잘못되었을 수 있습니다. 나는 당신이 그것을 바꾸지 않았다고 말하지만, 다른 것들 (예 : 어셈블리 이름)을 바꾸었다면 여전히 틀릴 수 있습니다.
  • 컴파일 후 태스크를 사용하여 EDMX를 어셈블리에 임베드 할 수 있으며 이로 인해 더 이상 작동하지 않습니다.

요컨대, 질문에 정확한 답변을 제공하기에 충분한 세부 사항이 없지만, 이러한 아이디어가 올바른 길로 인도되기를 바랍니다.

업데이트 : 문제 해결을위한보다 완벽한 단계를 갖춘 블로그 게시물을 작성 했습니다 .


70
지난번에 내용 비교 유틸리티와 비교하려는 노력에도 불구하고 연결 문자열 잘못되었습니다.
J. Steen

16
저에게도 연결줄이었습니다. 자체 App.config에 연결이 필요한 통합 테스트가있는 경우 edmx를 업데이트 할 때 동기화되지 않을 수 있습니다.
Ray

11
OK, 나는 단순히 "Embed"를 설정하여 수정했습니다. 컴파일하고 다른 것으로 재설정합니다. 그게 내 문제를 해결했다.
Shimmy Weitzhandler

6
같은 문제가 있었지만 솔루션을 사용해 보았고 +1을주고 싶었습니다. 이미 과거에 이미 해냈습니다. ;) 전에이 문제가 발생한 것을 기억조차하지 않습니다. 이번에는 클래스 라이브러리에서 edmx가있는 올바른 연결 문자열이었고 웹 응용 프로그램을 사용할 때 잘못되었습니다.
Episodex

9
멋진 가이드. 나를 위해 res : // * / MyModel1 ...을 원할 때 res : // * / Database.MyModel2 ...를 사용하는 다른 연결 문자열을 복사했습니다 (데이터베이스는 Integration Tests 프로젝트 내의 폴더입니다)
emragins

360

이 작은 변화는이 문제에 도움이됩니다.

3 개의 프로젝트가있는 솔루션이 있습니다.

connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;

로 변경

connectionString="metadata=res://*/;

11
그것은 나를 위해 고쳤지만 도대체 무엇을 의미합니까?
랜스 피셔

18
@ 랜스 : 나는 이 블로그 게시물
Craig Stuntz

4
@ jocull : 아니요, 많은 경우 작동하지 않으며 다른 경우에는 느려질 것입니다. 이유를 이해하려면 내 블로그 게시물을 읽으십시오.
Craig Stuntz

6
내 .edmx를 모델 폴더로 옮기고 연결 문자열을 업데이트하는 것을 잊었습니다. 훌륭한 포인터. 감사. 알아내는 데 몇 시간이 걸렸을 것입니다.
muruge

11
귀하는 열악한 Microsoft 직원으로부터 열악한 Microsoft 직원을 구했습니다.
머핀 맨

115

Edmx가 한 프로젝트에 있고 다른 프로젝트에서 사용하는 경우이 예외가 발생할 수 있습니다.

그 이유는 Res://*/CURRENT 어셈블리의 리소스를 가리키는 URI입니다. Edm이 사용중인 코드와 다른 어셈블리에 Edm이 정의되어 있으면 리소스를 찾을 수 없으므로 res : // * /가 작동하지 않습니다.

'*'를 지정하는 대신 공개 키 토큰을 포함하여 어셈블리의 전체 이름을 제공해야합니다. 예 :

res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...

연결 문자열을 구성하는 더 좋은 방법은 EntityConnectionStringBuilder를 사용하는 것입니다.

public static string GetSqlCeConnectionString(string fileName)
{
    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlServerCe.3.5";
    csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName);

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}

public static string GetSqlConnectionString(string serverName, string databaseName)
{
    SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder();

    providerCs.DataSource = serverName;
    providerCs.InitialCatalog = databaseName;
    providerCs.IntegratedSecurity = true;

    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlClient";
    csBuilder.ProviderConnectionString = providerCs.ToString();

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}

여전히 예외가 발생하면 리플렉터에서 어셈블리를 열고 .csdl, .ssdl 및 .msl 파일의 파일 이름을 확인하십시오. 리소스의 이름이 메타 데이터 값에 지정된 것과 다른 경우 작동하지 않습니다.


8
어셈블리에서 네임 스페이스를 사용하는 경우 "YourEdmxFileName"은 정규화 된 이름이어야합니다 (예 : "YourNamespace.YourEdmxFileName"). 그러나 어셈블리 이름과 동일한 네임 스페이스 부분을 제거해야합니다.
Marcel

5
MSDN은 두 번째 단락이 잘못되었다고 말합니다. "와일드 카드 (*)를 사용하는 경우 Entity Framework는 모든 어셈블리를 통해 올바른 이름의 리소스를 찾아야합니다."
Craig Stuntz

네임 스페이스는 관련이 없지만 임베디드 파일 경로는 관련이 있다고 확신합니다. 따라서 연결된 edmx 파일의 * .Designer.cs 파일을 검사하고 자동 생성 된 클래스 네임 스페이스가 MyCompany라는 것을 확인하더라도 사용하지 않아야합니다. 대신 경로는 assemblyname, 솔루션 폴더 이름 / 파일 이름입니다. 예를 들면 다음과 같습니다. "metadata = res : // * / EntityModels. <filename> .csdl |" + "res : // * / EntityModels. <파일 이름> .ssdl |" + "res : // * / EntityModels. <파일 이름> .msl;"
Daniel

1
@Daniel, 그것은 대부분 정확하지만 네임 스페이스와 포함 된 파일 경로는 때때로 동일합니다. Reflector (또는 그에 대한 무료 대안)를 확인해야합니다.
Craig Stuntz 2016 년

버전, 공개 키 토큰 등이없는 어셈블리 이름만을 사용하여 작동하는 것처럼 보입니다.res://MyAssembly/folder.<filename>.csdl...
Ivan Ferrer Villa

67

비슷한 오류가 발생했습니다. 나는 프로젝트 (긴 이야기)를 다시 만들고 오래된 프로젝트에서 모든 것을 가져 왔습니다. 내 모델이 이전에 'Model'이라는 디렉토리에 있었고 이제는 'Models'라는 디렉토리에 있다는 것을 알지 못했습니다. Web.Config의 연결을 다음과 같이 변경하면 다음과 같습니다.

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl 

이에:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl

모든 (변경 일 ModelModels). 이 문자열에서이 세 위치를 변경해야합니다.


2
Entity Framework 모델을 Model에서 DAL로 옮겼습니다. 그러나 Linq 술어를 테스트하기 위해 테스트 프로젝트에서 테스트를 작성했을 때 (1 주일 후). 이 오류가 발생했습니다. 테스트 프로젝트 App.config를 메인 프로젝트의 web.config에서 어떻게 보이는지 수정했습니다. 그래서 당신의 간단한 답변이 저를 추적했습니다.
Patrik Lindström

예, 감사합니다. 파일 이름을 확인하십시오. 어떻게 든 나는 옛 이름을 가졌다.
PeterX

7
둘 사이에 차이가 있습니까?!
Erwin Rooijakkers

2
@ErwinRooijakkers 모델 대 모델
Marc

Craig의 블로그를 읽은 후에도 같은 작업을 수행했지만 학습을위한 +1은 "엔티티"클래스 라이브러리에서 변경 한 내용이이를 참조하는 프로젝트의 구성 파일에서 자동으로 수행되지 않는다는 것을 기억하는 것이 중요합니다. / 한숨이 다행입니다.
ruffin

26

Reflector없이 모델 이름을 확인하는 빠른 방법은 ... 디렉토리를 찾으십시오

... obj / {config output} / edmxResourcesToEmbed

.csdl, .msl 및 .ssdl 리소스 파일이 있는지 확인하십시오. 이들이 서브 디렉토리에있는 경우 서브 디렉토리 이름 앞에 모델 이름을 붙여야합니다.

예를 들어, 3 개의 리소스 파일은 하위 디렉토리 Data 에 있으므로 연결 문자열은

metadata = res : // * / Data .MyModel.csdl | res : // * / Data .MyModel.ssdl | res : // * / Data .MyModel.msl;

(메타 데이터 = res : //*/MyModel.csdl | res : //*/MyModel.ssdl | res : //*/MyModel.msl;).


이것은 내 문제였습니다. 이것에 몇 시간을 잃었다. 이 쉬운 설명에 감사드립니다
Fernando Carvalhosa

큰 대답은 실제로 문자열이 무엇인지 찾는 방법을 설명합니다. 그리고 하위 폴더에 '.'이 있음을 보여줍니다. 구분 기호로 사용되며 '\'또는 '/'가 아닙니다.
cjb110

16

또한이 문제가 있었고 web.config의 연결 문자열이 내 EDMX가있는 어셈블리의 app.config에있는 연결 문자열과 약간 다르기 때문입니다. 왜 바뀌 었는지 모르겠지만 두 가지 버전이 있습니다.

App.config :

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SMCSModel.csdl|res://*/Model.SMCSModel.ssdl|res://*/Model.SMCSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Web.config :

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SCMSModel.csdl|res://*/Model.SCMSModel.ssdl|res://*/Model.SCMSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

수정 된 것은 단순히 app.config 문자열 ( " App=EntityFramework"it want " application name=EntityFramework" 대신에 작은 차이를 알 수 있음 )을 web.config에 복사하는 것만 으로 문제가 해결되었습니다. :)


1
고마워, 이것은 실제로 내 문제였다. EF와 다른 프로젝트 WCF로 DB에 액세스하는 1 개의 프로젝트가 있습니다. 첫 번째 프로젝트의 이름을 변경 한 후 첫 번째 프로젝트의 App.config에서 connectionString이 변경되었습니다. 그래서 web.config에서 프로젝트 WCF에서 connectionString을 변경해야했습니다. :)
Volkan

대한 MSDN 문서에서 docs.microsoft.com/en-us/dotnet/framework/data/adonet/... : The .NET Framework data provider for SQL Server (SqlClient) supports many keywords from older APIs, but is generally more flexible and accepts synonyms for many of the common connection string keywords.당신이 기대 키워드 만 사용해야합니다 엔티티 프레임 워크 연결 문자열은, 그 유연성을 공유하지 않습니다.
Suncat2000

13

실수로 edmx 파일의 빌드 작업 (IDE의 속성 아래에 나타남)을 'EntityDeploy'에서 'None'으로 전환했을 때 나에게 이런 일이 발생했습니다. EntityDeploy는 메타 데이터를 채우는 것입니다. http://msdn.microsoft.com/en-us/library/cc982037.aspx 참조


이것은 내 수정이었습니다-복사 할 때 내 edmx의 이름을 .old로 바꾸고 몇 가지를 시도했지만 나중에 이름을 바꾸면 빌드 조치 자체가 없음으로 설정 되어이 오류가 발생하여 EntityDeploy로 다시 설정되었습니다. 내 문제 :)
eth0

EDMX 파일을 다른 폴더로 옮기고 내장 리소스 이름도 업데이트되도록 빌드 작업을 변경해야했습니다. 감사!
David

이것이 나를위한 해결책이었습니다. .NET Standard로 업그레이드하는 과정에서 해당 설정이 손실되었습니다. 내 정신을 구해 주셔서 감사합니다!
NetherGranite

11

이것은 새로운 .edmx 디자이너를 빌드하기 전에 솔루션을 정리하지 않으면 나에게 발생합니다. 따라서 새로운 .edmx 디자이너를 구축하기 전에 솔루션을 정리하는 것을 잊지 마십시오. 이를 통해 더 많은 문제를 건너 뛸 수 있습니다. Visual Studio를 처음 사용하는 경우 제공되는 탐색 세부 정보를 아래에 표시하십시오.

클릭-> 빌드-> 청소 솔루션

그런 다음 클릭-> 빌드-> 솔루션 재구성

도움이 되었기를 바랍니다. 모두 감사합니다


8

나는 이것으로 30 분 동안 행복한 시간을 보냈습니다. 엔티티 객체의 이름을 바꾸고 구성 파일의 항목의 이름을 바꾸었지만 더 많은 것이 있습니다 ... CSDL에 대한 참조도 변경해야합니다

매우 쉽게 놓칠 수 있습니다-이름을 바꾸는 경우 모든 것을 얻을 수 있는지 확인하십시오 ....


6

나는 같은 문제가 있었다. 리플렉터를 사용하여 호환되는 dll을 살펴본 결과 리소스 이름이 잘못되었음을 알았습니다. 나는 이름을 바꾸었고 지금은 좋아 보인다.


6

필자의 경우 edmx 파일의 속성을 변경하면 해결됩니다.

  1. edmx 파일을여십시오
  2. EDMX 디자이너의 아무 곳이나 마우스 오른쪽 버튼으로 클릭
  3. 속성을 선택하십시오
  4. "메타 데이터 아티팩트 처리"라는 특성을 "출력 어셈블리에 포함"으로 업데이트

이것은 나를 위해 문제를 해결했습니다. 문제는 컨테이너가 메타 데이터를 찾으려고 할 때 찾을 수 없다는 것입니다. 동일한 어셈블리에서 간단히 만들 수 있습니다. 다른 어셈블리에 edmx 파일이 있으면이 솔루션이 작동하지 않습니다.


+1,000,000이 오늘 저에게 근본적인 문제였습니다. 제품 네임 스페이스 재구성 및 어셈블리 통합의 고통.
Mike

6

이 오류에 하루 종일 보냈습니다

당신이 작업하는 경우 n-tear architecture

또는 DataAccessLayer 양식 으로 separate Models생성 하려고 EDMX했습니다.DomainModelLayer

어쩌면이 오류가 발생합니다

  1. 첫 번째 문제 해결 단계에서 반드시 연결 문자열을 만드는 것입니다 webconfig (UILayer)appconfig (DataAccessLayer)동일
  2. 두 번째로 매우 중요한 connection string

    connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provid.....

    그게 문제 야

지구상의 어디에서 왔 Model거나 연결 문자열의 .csdl 이 어디에서 왔습니까?

여기에 우리의 해결책은 그림을 봅니다.

여기에 이미지 설명을 입력하십시오

도움을 바랍니다


5

Visual Studio 2010, VB.net (ASP.NET) 4.0에서이 문제를 해결할 수있었습니다.

엔터티 모델 마법사 중에 엔터티 연결 문자열을 볼 수 있습니다. 거기에서 연결 문자열에 복사하여 붙여 넣을 수 있습니다.

내가 빠진 것은 "App_Code"뿐입니다. 연결 문자열에.

entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"

불행히도 마법사의 연결 문자열이 app.config에 올바르지 않습니다. @leqid는 모델 경로를 수정하는 좋은 방법을 제안했습니다.
Der_Meister

5

몇 시간 동안 인터넷 검색을 시도하고 해결책을 찾지 못했습니다. 여기에 몇 가지 해결책이 나와 있습니다. 나는 또한 나를 위해 일한 것을 주목했다. (EF 버전 6.1.1 및 SQL Server 2014를 사용하고 있었지만 이전 DB)

  1. 프로젝트를 다시 빌드하고 다시 시도하십시오.
  2. 닫고 열린 VS-이것이 어떻게 작동하는지 모르겠습니다.
  3. .EDMX 파일을 디렉토리에 넣었는지 확인하고 ConnectionString에 디렉토리를 포함시켜야합니다. 예를 들어 광산은 DAL 폴더 안에 있습니다. 그래서 다음과 같이 보입니다 : connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl;(이 파일은 파일입니다. ~ / obj / .. 디렉토리 아래의 솔루션 탐색기에서 모든 파일 표시를 토글 할 수 있습니다)

... 그리고 더 많은 것을 시도했습니다 [예 : EntityFramework 버전을 이후 버전으로 되돌리기 (확실하지 않음)]


나를 위해 일한 것 :

기사에서 내 문제를 해결하는 데 도움이되었습니다. 난 그냥 내 변경 ProviderManifestToken="2012"에를 ProviderManifestToken="2008"EDMX 파일에. 이것을하기 위해:

솔루션 탐색기

  1. .edmx 파일을 마우스 오른쪽 버튼으로 클릭
  2. 로 열기
  3. 에디터 XML
  4. 2008 년으로 ProviderManifestToken = "XXXX"변경

도움이 되길 바랍니다.


나는 최근에 겉보기에는 아무런 변화가 없었지만이 문제가있었습니다. VS를 다시 시작하여 아무 소용이 없었지만 청소하고 다시 작성하여 수정했습니다. 따라서 다른 사람에게 변경 사항을 적용하지 않았고 나머지 부분이 관련이없는 경우 깨끗하고 재구성하십시오.
Greg

5

다른 프로젝트에서 edmx를 사용하는 경우 연결 문자열에서 다음을 변경하십시오.

metadata=res://*/Data.DataModel.csdl

...에...

metadata=res://*/DataModel.csdl

이것이 사실입니다. 새 프로젝트 하위 폴더로 이동하려면 folder.subfolder앞에 폴더를 추가 해야합니다.
qakmak

고마워,이 솔루션은 나를 위해 일했다. .edmx 파일을 한 프로젝트의 디렉토리에서 다른 프로젝트의 루트로 이동했으며 솔루션의 모든 연결 문자열에서 디렉토리 이름을 제거해야했습니다.
Chris

4

EDMX 및 기타 잡화를 비롯하여 두 대의 다른 컴퓨터에서 데이터베이스를 다시 만든 후에도 궁극적 인 솔루션은 Entity Framework의 첫 번째 버전을 사용하지 않는 것입니다. .NET 4.0에서 다시 평가하기를 기대합니다.

같은 문제가 다시 발생 하고 답을 찾기 위해 모든 것을 검색 한 후에 마침내 같은 문제가있는 사람을 찾았습니다. 연결 문자열이 Visual Studio의 마법사에 의해 올바르게 생성되지 않았으며 메타 데이터 리소스에 대한 링크에 중요한 경로가 누락 된 것 같습니다.

v1.0 BUG ?: 지정된 메타 데이터 리소스를로드 할 수 없습니다. 스크립트! = 모델

업데이트 2013-01-16 : EF 코드 우선 사용 (기존 데이터베이스 포함)을 거의 독점적으로 사용하도록 전환 한이 문제는 더 이상 문제가되지 않습니다. 저에게는 이것이 자동 생성 코드 및 구성으로 인한 혼란을 줄이고 제품에 대한 제 자신의 통제력을 높이는 실용적인 솔루션이었습니다.


4

내 문제와 해결책, 증상은 "지정된 메타 데이터 리소스를로드 할 수 없습니다"와 동일하지만 근본 원인이 다릅니다. 솔루션에 2 개의 프로젝트가 있었고 하나는 EntityModel이고 다른 하나는 솔루션이었습니다. 실제로 EntityModel에서 EDMX 파일을 삭제하고 다시 작성했습니다.

해결책은 웹 응용 프로그램 프로젝트로 돌아가서이 줄을 구성 파일에 추가해야한다는 것입니다. 새 모델은 "other"프로젝트의 Web.Config 파일에서 복제해야하는 몇 가지 항목을 변경했습니다. 이전 구성이 더 이상 좋지 않았습니다.

     <add name="MyEntities"
     connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;
                    provider=System.Data.SqlClient;
                    provider connection string=&quot;
                    data source=Q\DEV15;initial catalog=whatever;
                    user id=myuserid;password=mypassword;
                    multipleactiveresultsets=True;
                    application name=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />

4

때로는 내 프로젝트 에서이 오류가 나타납니다. 나는 그것을 해결

1-EDMX 파일을 마우스 오른쪽 버튼으로 클릭

2- Run Custom Tool옵션 선택

3-프로젝트 재 구축


이것은 나를 위해 일했지만 나도 나중에 다시
만들어야

3

필자의 경우이 문제는 모델의 edmx 파일 이름 바꾸기와 관련이 있습니다 ... csdl / ssdl / msl 파일의 app.config 연결 문자열을 수정하면 문제가 해결되었습니다.

EF 4.0 디자이너를 사용하여 csdl / ssdl / msl을 생성하는 경우이 3 개의 "파일"은 실제로 모델의 기본 edmx 파일에 저장됩니다. 이 경우 Waqas의 게시물이 거의 마크에 있습니다. 그의 예제에서 "Model_Name"은 모델의 .edmx 파일의 현재 이름 (.edmx없이)으로 변경되어야한다는 것을 이해하는 것이 중요합니다.

또한 edmx 파일이 프로젝트의 루트 레벨이 아닌 경우 상대 경로로 Model_Name을 시작해야합니다 (예 :

res://*/MyModel.WidgetModel.csdl|res://*/MyModel.WidgetModel.ssdl|res://*/MyModel.WidgetModel.msl

csdl / ssdl / msl을 지정합니다. xml은 'MyModel'이라는 폴더에 저장된 모델 파일 'WidgetModel.edmx'에 저장됩니다.


3

이 헬퍼 클래스를 작성하여 ObjectContext 객체의 인스턴스를 사용하는 프로젝트와 다른 프로젝트에 정의 할 때 ObjectContext 객체의 인스턴스를 만듭니다. 구성 파일에서 연결 문자열을 구문 분석하고 '*'를 전체 어셈블리 이름으로 바꿉니다.

리플렉션을 사용하여 오브젝트를 빌드하기 때문에 완벽하지는 않지만 찾을 수있는 가장 일반적인 방법입니다.

그것이 누군가를 돕기를 바랍니다.

public static class EntityHelper<T> where T : ObjectContext
{
    public static T CreateInstance()
    {
        // get the connection string from config file
        string connectionString = ConfigurationManager.ConnectionStrings[typeof(T).Name].ConnectionString;

        // parse the connection string
        var csBuilder = new EntityConnectionStringBuilder(connectionString);

        // replace * by the full name of the containing assembly
        csBuilder.Metadata = csBuilder.Metadata.Replace(
            "res://*/",
            string.Format("res://{0}/", typeof(T).Assembly.FullName));

        // return the object
        return Activator.CreateInstance(typeof(T), csBuilder.ToString()) as T;
    }
}

3

모든 SelftrackingEntities사용자를 위해 Microsoft Walk-through를 따르고 Object 컨텍스트 클래스를 wcf 서비스 프로젝트 (컨텍스트 .tt에 연결하여)로 분리 한 경우이 답변은 다음과 같습니다.

이 게시물에 표시된 답변 중 일부는 다음과 같은 코드를 포함합니다.

... = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName); 

당신을 위해 작동하지 않습니다! 그 이유는 YourObjectContextType.Assembly이제 다른 어셈블리 (wcf 프로젝트 어셈블리 내부)에 상주 하기 때문입니다 .

따라서 YourObjectContextType.Assembly.FullName ->로 바꿔야합니다.

ClassTypeThatResidesInEdmProject.Assembly.FullName 

재밌어요


2

이 같은 오류 메시지에 문제가있었습니다. Visual Studio 2010을 닫았다가 다시 열어서 문제가 해결되었습니다.


2

어셈블리의 이름을 변경했기 때문에 동일한 문제가 발생했습니다.

또한 프로젝트 Properties / AssemblyInfo.cs의 AssemblyTitle 및 AssemblyProduct 속성에서 이름을 바꾸고 edmx 파일에 대한 참조를 삭제하고 다시 추가해야했습니다.

그런 다음 잘 작동했습니다.


2

같은 문제가 발생하여 데이터베이스에서 edmx를 다시 만들었습니다. 내 문제를 해결합니다.


2
불행히도 그 원인이 아니라 증상을 다루고 치료합니다.
Clarice Bouwer

2

컴파일러가 기존 메타 데이터가 아닌 것을 가리 키므로 app.config connectionString을 Web.configConnectionString에 복사하기 만하면 됩니다.


1

또한 기존 .edmx를 새 프로젝트로 가져오고 있었고 기본 네임 스페이스가 중요하지 않은 경우 다른 하위 디렉토리로 가져 오기 때문에 연결을 업데이트해야한다는 점을 제외하고 Rick과 동일한 문제와 해결책이있었습니다. 다른 하위 디렉토리 이름을 포함하기 위해 Web.Config 내부의 문자열을 세 곳에 배치합니다.


1

솔루션 루트로 프로젝트를 이동했을 때 (프로젝트 위치로 인해 Mvc3AppConverter의 의심되는 버그를 극복하기 위해) 솔루션 폴더에 프로젝트가 포함 된 솔루션과 동일한 문제가있었습니다.

모든 프로젝트 참조 이후에 컴파일 된 솔루션이 필요에 따라 다시 추가되었지만 웹 사이트가 시작될 때 오류가 발생했습니다.

EDMX는 이동 된 프로젝트 중 하나 ( '데이터'프로젝트)에 있지만 물론 데이터 프로젝트에 대한 참조가 부족하여 컴파일 오류가 발생하지 않았으며 런타임 오류 만 발생했습니다.

기본 프로젝트에 누락 된 참조를 추가하면이 문제가 해결되므로 연결을 전혀 편집 할 필요가 없습니다.

나는 이것이 다른 누군가를 돕기를 바랍니다.


1

나를 위해, 데이터 액세스 계층과 사용자 인터페이스 계층을 분리했습니다. 그래서 각 레이어마다 엔티티 연결 문자열이 있습니다.

이 두 개의 분리 된 연결 문자열을 동일하게 수정하기 전에 여전히 아래 오류가 있음을 발견했습니다.

Unable to load the specified metadata resource

그래서 나는 그 두 계층 (DAL, UI)에 대해 동일한 연결 문자열이되도록 완벽하게 작동합니다.

내 해결책은 모든 연결 문자열을 이미 제시 한 위치에 상관없이 동일하게 만드는 것 입니다.


1

나는 어제이 문제가 있었고 디버그에서 내 코드와 SQL 프로파일 러의 출력을보고있었습니다.

이 게시물을 읽고 이해하기 전에 이해할 수 없었던 것은 EntityFramework가 DB를 호출 할 때이 오류가 발생하는 이유였습니다. SQL 프로파일 러에서 수백 줄을 살펴보고 데이터베이스 모델의 문제점을 해결하려고했습니다. 나는 내가 기대했던 부름과 같은 것을 찾을 수 없었고, 솔직히 내가 찾고있는 것을 확신하지 못했습니다.

이 위치에 있으면 연결 문자열을 확인하십시오. 내 생각 엔 EntityFramework가 SQL을 만들기 전에 연결 문자열의 메타 데이터 부분에 지정된 모델을 검사한다는 것입니다. 제 경우에는 잘못되었습니다. EntityFramework는 심지어 DB까지는하지 못했습니다.

이름이 올바른지 확인하십시오. 일단 정렬하면 응용 프로그램 이름이 'EntityFramework'인 SQL 프로파일 러에서 SQL이 호출되는 테이블을 호출하는 호출을 보았습니다.


1

잘못된 app.config 또는 web.config 파일이이 작업을 수행 할 수 있습니다. UI의 web.config에 app.config 연결 문자열을 복사하여 다음과 같이 입력했습니다.

<connectionStrings>
    <connectionStrings>
          <add name="name" connectionString="normalDetails"/>
    </connectionStrings>
</connectionStrings>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.