programing

메타데이터예외:지정한 메타데이터 리소스를 로드할 수 없습니다.

starjava 2023. 5. 17. 22:16
반응형

메타데이터예외:지정한 메타데이터 리소스를 로드할 수 없습니다.

갑자기 나는 계속해서.MetadataException생성된 내 데이터를 인스턴스화할 때ObjectContextApp의 연결 문자열입니다.구성이 올바른 것 같습니다. 마지막으로 작동한 이후로 변경되지 않았습니다. 기본 데이터베이스에서 새 모델(edmx-file)을 변경 없이 재생성해 보았습니다.

아이디어 있는 사람?

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

EDMX를 다시 만들어 봤습니다.저는 프로젝트를 다시 만들어 보았습니다.데이터베이스를 처음부터 다시 만들어 보기도 했습니다.운이 없군요.

이는 애플리케이션이 EDMX를 로드할 수 없음을 의미합니다.이것을 유발할 수 있는 몇 가지가 있습니다.

  • 모델의 MetadataArtifactProcessing 속성을 Copy to Output Directory로 변경했을 수 있습니다.
  • 연결 문자열이 잘못되었을 수 있습니다.변경하지 않았다고 하지만 다른 사항(예: 어셈블리 이름)을 변경했다면 여전히 잘못된 것일 수 있습니다.
  • 컴파일 후 작업을 사용하여 어셈블리에 EDMX를 포함하고 있을 수 있으며, 이는 어떤 이유로 더 이상 작동하지 않습니다.

간단히 말해서, 당신의 질문에는 정확한 대답을 하기에 충분한 세부사항이 없지만, 이 아이디어들이 당신을 올바른 방향으로 이끌기를 바랍니다.

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

사소한 수정이 이 문제를 해결하는 데 도움이 되었습니다.

3개의 프로젝트 참조 자료가 있는 솔루션이 있었습니다.

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

내가 바꾼 것은:

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

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

는 유는입니다.Res://*/현재 어셈블리의 리소스를 가리키는 uri입니다.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 파일의 파일 이름을 확인합니다.리소스의 이름이 메타데이터 값에 지정된 이름과 다를 경우 리소스가 작동하지 않습니다.

저도 비슷한 오류가 있었습니다.저는 프로젝트를 다시 만들고(긴 이야기), 이전 프로젝트의 모든 것을 취소했습니다.저는 제 모델이 이전에는 '모델'이라는 디렉터리에 있었고, 지금은 '모델'이라는 디렉터리에 있다는 것을 깨닫지 못했습니다.내 웹에서 연결을 변경한 적이 있습니다.구성 위치:

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

대상:

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

것이 작동했습니다(되었습니다.ModelModels참고로 이 문자열에서 이 세 자리를 변경해야 했습니다.

그리고 리플렉터 없이 모델 이름을 빠르게 확인할 수 있는 방법...디렉토리를 찾습니다.

...obj/{config output}/edmxResourcesToEmbed

.csdl, .msl 및 .ssdl 리소스 파일이 있는지 확인합니다.하위 디렉터리에 있는 경우 하위 디렉터리의 이름을 모델 이름 앞에 붙여야 합니다.

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

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

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

이 문제는 새 .edmx 디자이너를 빌드하기 전에 솔루션을 클리닝하지 않을 때 발생합니다.따라서 새로운 .edmx 디자이너를 구축하기 전에 솔루션을 정리하는 것을 잊지 마십시오.이것은 제가 이 문제에 대해 훨씬 더 많은 문제를 건너뛸 수 있도록 도와줍니다.비주얼 스튜디오에 새로 들어온 경우 제공된 탐색 세부 정보를 따릅니다.

클릭->빌드->클린 솔루션

그런 다음 ->빌드 ->솔루션 재구축을 클릭합니다.

이게 도움이 되길 바랍니다.여러분 감사합니다.

저도 이 문제가 있었는데, 제 웹.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" />

config 입니다(" app.config app.config app.config app." 대신가 있다는 것을 ).App=EntityFramework그것은 "를 원했습니다.application name=EntityFramework")를 web.config에 입력하면 문제가 해결됩니다.:)

실수로 edmx 파일의 빌드 작업(IDE의 속성에 표시됨)을 'EntityDeploy'에서 'None'으로 전환했을 때 이 문제가 발생했습니다.EntityDeploy는 메타데이터를 채워줍니다. http://msdn.microsoft.com/en-us/library/cc982037.aspx 을 참조하십시오.

다른 프로젝트의 edmx를 사용하는 경우 연결 문자열에서 변경...

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

...에게...

metadata=res://*/DataModel.csdl

때때로 저는 제 프로젝트에서 이 오류를 봅니다.나는 그것을 해결합니다.

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

- 2번 선택 - 택선Run Custom Tool

3 - 프로젝트 재구축

저는 이것으로 행복한 30분을 보냈습니다.엔티티 개체의 이름을 바꾸고 구성 파일의 항목 이름을 바꿨습니다. 하지만 더 많은...당신은 csdl에 대한 참조도 변경해야 합니다.

놓치기 매우 쉽습니다. 이름을 바꾸려면 모든 을 얻는지 확인하십시오.

저도 같은 문제가 있었습니다.리플렉터를 사용하여 준수한 DLL을 조사한 결과 리소스 이름이 올바르지 않습니다.이름을 바꿨는데 지금은 괜찮아 보입니다.

저의 경우는 edmx 파일의 속성을 변경하여 해결합니다.

  1. edmx 파일 열기
  2. EDMX 디자이너의 원하는 위치를 마우스 오른쪽 버튼으로 클릭합니다.
  3. 속성 선택
  4. 메타데이터 아티팩트 처리라는 속성을 "출력 어셈블리에 포함"으로 업데이트

이것은 저에게 문제를 해결했습니다.문제는 컨테이너가 메타데이터를 찾으려 할 때 찾을 수 없다는 것입니다. 따라서 동일한 어셈블리로 만들기만 하면 됩니다.다른 어셈블리에 edmx 파일이 있는 경우 이 솔루션은 작동하지 않습니다.

저는 이 오류에 하루 종일 시간을 보냈습니다.

와 함께 일하고 있는 경우n-tear architecture

혹은 당신이 시도했던 것.separate Models.EDMX Data Access to 양식데계층스액세터DomainModelLayer

아마도 당신은 이 오류를 얻을 것입니다.

  1. 첫 번째 문제 해결 단계는 연결 문자열을 확인하는 것입니다.webconfig (UILayer)그리고.appconfig (DataAccessLayer) ㅠㅠ
  2. 두 번째는 매우 중요한 것입니다.

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

    그것이 문제입니다.

서 도체어서온것까입니디대?까니▁from것입▁got▁on온▁where▁i▁earth?Model 내 확인하십시오. .csdl은 .csdl과 같습니다.

여기 우리의 해결책이 사진을 봅니다.

여기에 이미지 설명 입력

도움이 되길 바랍니다

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"

몇 시간 동안 구글을 검색하고 제안된 해결책을 해결하려고 노력했지만 아무 것도 효과가 없었습니다.여기에 몇 가지 솔루션을 나열했습니다.저는 또한 저에게 적합한 것에 주목했습니다. (EF 버전 6.1.1과 SQL 서버 2014를 사용하고 있었지만 이전 DB)

  1. 프로젝트를 다시 빌드하고 다시 시도합니다.
  2. VS 닫기 및 열기 - 어떻게 작동하는지 모르겠습니다.
  3. 하고, 문자열에 합니다.EDMX 파일을 디렉터리 안에 넣었는지 확인하고, 디렉터리를 연결 문자열에 포함시키는지 확인합니다.예를 들어, 내 것은 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. 공급자 매니페스트 변경Token="XXXX"(2008 포함)

그게 도움이 되길 바랍니다.

제 경우, 이 문제는 모델의 edmx 파일 이름을 변경하는 것과 관련이 있습니다.csdl/ssdl/msl 파일에 대한 app.config 연결 문자열을 수정하여 문제를 해결했습니다.

EF 4.0 디자이너를 사용하여 csdl/sdl/msl을 생성하는 경우, 이 세 개의 "파일"은 실제로 모델의 기본 edmx 파일에 저장됩니다.이 경우, 와카스의 게시물은 거의 정확합니다.이 예제의 "Model_Name"은 모델의 .edmx 파일(.edmx 제외)의 현재 이름으로 변경해야 합니다.

또한 edmx 파일이 프로젝트의 루트 수준에 있지 않은 경우 Model_Name 앞에 상대 경로(예:

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

csdl/ssdl/msl xml이 모델 파일 'WidgetModel.edmx'에 저장되며, 이 파일은 'MyModel'이라는 폴더에 저장됩니다.

궁극적인 해결책은 (EDMX 및 기타 혼합물뿐만 아니라 두 대의 다른 컴퓨터에서 데이터베이스를 다시 만든 후에도) Entity Framework의 첫 번째 버전을 사용하지 않는 것이었습니다..NET 4.0에서 다시 평가하기를 기대합니다.

다시 같은 문제에 부딪혀 답을 찾다가, 마침내 같은 문제를 가진 사람을 발견했습니다.Visual Studio의 마법사에서 연결 문자열이 올바르게 생성되지 않았으며 메타데이터 리소스에 대한 링크에 중요한 경로가 없는 것 같습니다.

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

2013-01-16 업데이트: EF Code First 관행(기존 데이터베이스에서도)을 거의 독점적으로 사용하는 것으로 전환하여 이 문제는 더 이상 문제가 되지 않습니다.저에게 이는 자동으로 생성된 코드와 구성으로 인한 혼란을 줄이고 제품에 대한 통제력을 높일 수 있는 실행 가능한 솔루션이었습니다.

문제와 해결 방법, 증상은 "지정된 메타데이터 리소스를 로드할 수 없습니다"와 같았지만 근본 원인은 서로 다릅니다.솔루션에 두 가지 프로젝트가 있었습니다. 하나는 Entity Model이었고 다른 하나는 솔루션이었습니다.실제로 Entity Model에서 EDMX 파일을 삭제하고 다시 만들었습니다.

해결책은 웹 애플리케이션 프로젝트로 돌아가서 구성 파일에 이 줄을 추가하는 것이었습니다.새 모델은 "다른" 프로젝트의 웹에서 복제해야 하는 몇 가지 항목을 변경했습니다.구성 파일.이전 구성이 더 이상 좋지 않습니다.

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

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;
    }
}

당신들 모두를 위해서.SelftrackingEntities하여) 이 를 위한 것입니다. Microsoft Walk-through, Microsoft Walk-through, (context.tt ) Object는 wcf에서 사용됩니다.

다음과 같은 코드가 포함된 이 게시물에 표시된 답변의 일부:

... = 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 

즐겁게 보내세요.

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

예외는 컴파일러가 존재하지 않는 메타데이터를 가리키므로 복사만 하기 때문입니다.app.config연결 문자열Web.config연결 문자열

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

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

또한 어셈블리에서 이름을 변경해야 했습니다.Properties/AssemblyInfo.cs 프로젝트의 제목 및 AssemblyProduct 특성, edmx 파일에 대한 참조 삭제 및 다시 추가.

그리고는 잘 작동했습니다.

또한 기존 .edmx를 새 프로젝트로 가져오는 것과 기본 네임스페이스를 다른 하위 디렉터리로 가져오는 것이 문제가 되지 않는다는 점을 제외하고는 Rick과 동일한 문제와 해결책을 가지고 있었습니다.다른 하위 디렉토리 이름을 포함하도록 세 위치에서 구성합니다.

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

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

EDMX는 이동된 프로젝트 중 하나('데이터' 프로젝트)에 있지만, 물론 Data 프로젝트에 대한 참조가 부족하여 컴파일 오류가 발생한 것은 아닙니다. 단지 런타임 오류일 뿐입니다.

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

이것이 다른 사람에게 도움이 되기를 바랍니다.

저는 데이터 액세스 계층과 사용자 인터페이스 계층을 분리했습니다.각 계층에 대한 엔티티 연결 문자열이 있습니다.

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

Unable to load the specified metadata resource

그래서 저는 이 두 계층(DAL, UI)에 대해 동일한 연결 문자열을 만들고 완벽하게 작동합니다.

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

어제 이 문제가 발생하여 디버그의 코드와 SQL Profiler의 출력을 보고 있었습니다.

제가 이 게시물을 읽고 이해하기 전에 이해할 수 없었던 것은 EntityFramework가 DB를 호출하면서 이 오류를 던지는 이유였습니다.저는 SQL Profiler에서 데이터베이스 모델에 어떤 문제가 있는지 알아보려고 수백 개의 줄을 살펴보고 있었습니다.제가 기대했던 것과 같은 전화를 찾을 수 없었고, 솔직히 저는 제가 무엇을 찾고 있는지 확신할 수 없었습니다.

이 위치에 있는 경우 연결 문자열을 확인합니다.EntityFramework가 SQL을 생성하기 전에 연결 문자열의 메타데이터 부분에 지정된 모델을 확인할 것입니다.저 같은 경우는 그게 잘못됐어요.EntityFramework는 DB까지 도달하지 못했습니다.

이름이 올바른지 확인합니다.이 문제를 해결한 후 SQL Profiler에서 ApplicationName이 'EntityFramework'이고 SQL이 예상 테이블을 호출하는 호출을 보았습니다.

빈약한 app.config 또는 web.config 파일은 이를 수행할 수 있습니다.UI에서 app.config 연결 문자열을 web.config에 복사하여 다음과 같이 입력했습니다.

<connectionStrings>
    <connectionStrings>
          <add name="name" connectionString="normalDetails"/>
    </connectionStrings>
</connectionStrings>

언급URL : https://stackoverflow.com/questions/689355/metadataexception-unable-to-load-the-specified-metadata-resource

반응형