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

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

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

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

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



답변

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

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

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

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


답변

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

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

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

로 변경

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


답변

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 파일의 파일 이름을 확인하십시오. 리소스의 이름이 메타 데이터 값에 지정된 것과 다른 경우 작동하지 않습니다.


답변

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

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

이에:

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

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


답변

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;).


답변

또한이 문제가 있었고 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에 복사하는 것만 으로 문제가 해결되었습니다. 🙂


답변

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