갑자기 나는 계속해서MetadataException
생성 된 인스턴스 생성에ObjectContext
수업. App.Config의 연결 문자열이 올바르게 보입니다. 마지막으로 작업 한 이래로 변경되지 않았습니다. 변경하지 않고 기본 데이터베이스에서 새 모델 (edmx 파일)을 다시 생성 해 보았습니다.
누구든지 아이디어가 있습니까?
세부 정보 : 속성을 변경하지 않았으며 출력 어셈블리의 이름을 변경하지 않았으므로 어셈블리에 EDMX를 포함하지 않았습니다. 나는 퇴근 할 때까지 10 시간을 기다렸을뿐입니다. 그리고 나서 더 이상 작동하지 않습니다.
나는 EDMX를 다시 만들려고 노력했다. 나는 프로젝트를 다시 만들려고 노력했다. 심지어 처음부터 데이터베이스를 다시 만들려고했습니다. 행운을 빈다.
이것은 응용 프로그램이 EDMX를로드 할 수 없음을 의미합니다. 이 문제를 일으킬 수있는 몇 가지 사항이 있습니다.
간단히 말해 정확한 답변을 제공하기에는 세부 사항이 충분하지 않지만 이러한 아이디어는 올바른 길을 찾아야합니다.
최신 정보:나는 썼다.문제 해결을위한보다 완벽한 단계가있는 블로그 게시물.
이 작은 변화는이 문제에 도움이됩니다.
나는 3 개의 프로젝트를 가진 해결책이있다.
connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;
로 변경
connectionString="metadata=res://*/;
Edmx가 한 프로젝트에 있고 다른 프로젝트에서 사용하고있을 때이 예외를 얻을 수 있습니다.
그 이유는Res://*/
CURRENT 어셈블리의 리소스를 가리키는 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 파일의 파일 이름을 확인하십시오. 자원의 이름이 메타 데이터 값에 지정된 이름과 다른 경우에는 작동하지 않습니다.
res://MyAssembly/folder.<filename>.csdl...
- Ivan Ferrer Villa
비슷한 오류가 발생했습니다. 나는 프로젝트 (긴 이야기)를 재창조했고, 오래된 프로젝트에서 모든 것을 꺼냈다. 내 모델이 이전에 '모델'이라는 디렉토리에 있었고 이제는 '모델'이라는 디렉토리에 있다는 것을 깨닫지 못했습니다. 일단 Web.Config에서 연결을 다음과 같이 변경했습니다.
<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl
이에:
<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl
모든 것이 작동했습니다 (변경됨).Model
에Models
). 이 문자열에서이 세 위치를 변경해야한다는 것에 유의하십시오.
Reflector없이 모델 이름을 확인하는 빠른 방법 .... 디렉토리를 찾습니다.
... obj / {config output} / edmxResourcesToEmbed
.csdl, .msl 및 .ssdl 리소스 파일이 있는지 확인하십시오. 하위 디렉토리에있는 경우 하위 디렉토리의 이름을 모델 이름 앞에 붙여야합니다.
예를 들어 내 세 개의 리소스 파일은 하위 디렉토리에 있습니다.데이터, 그래서 내 연결 문자열이 있어야했다.
metadata = res : // * /데이터.MyModel.csdl | res : // * /데이터.MyModel.ssdl | res : // * /데이터.MyModel.msl;
(메타 데이터 = res : //*/MyModel.csdl | res : //*/MyModel.ssdl | res : //*/MyModel.msl).
나는 또한이 문제가 있었고 내 web.config의 connectionstring이 내 EDMX가있는 어셈블리의 app.config에있는 connectionstring과 약간 다르기 때문에 발생했습니다. 왜 그것이 바뀌 었는지는 알 수 없지만 두 가지 버전이 있습니다.
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="data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" 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="data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
고정 된 것은 단순히 app.config 문자열을 복사하는 것이 었습니다 (끝에 작은 차이가 있음을 알 수 있습니다 - 대신 "App=EntityFramework
"원했어"application name=EntityFramework
") web.config에 넣고 문제가 해결되었습니다. :)
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.
Entity Framework 연결 문자열은 이러한 유연성을 공유하지 않으므로 예상 한 키워드 만 사용해야합니다. - Suncat2000
이것은 실수로 edmx 파일 (IDE의 Properties 아래에 있음)의 Build Action을 'EntityDeploy'에서 'None'으로 전환했을 때 일어난 일입니다. EntityDeploy는 사용자를 위해 메타 데이터를 채 웁니다.http://msdn.microsoft.com/en-us/library/cc982037.aspx
방금 30 분을 행복하게 보냈습니다. 엔티티 개체의 이름을 변경하고 구성 파일의 항목 이름을 변경했지만 더 많은 내용이 있습니다 ... 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"
나는 똑같은 문제가 있었다. 리플렉터를 사용하여 준수한 DLL을 조사한 결과 리소스 이름이 옳지 않다는 것을 알았습니다. 나는 이름이 바뀌었고 지금은 괜찮아 보인다.
제 경우에는 edmx 파일의 속성을 변경하여 해결됩니다.
이것은 나를 위해 문제를 해결했다. 문제는 컨테이너가 메타 데이터를 찾으려고 할 때 찾을 수 없다는 것입니다. 같은 어셈블리에서 간단하게 만들 수 있습니다. 이 솔루션은 다른 어셈블리에 edmx 파일이 있으면 작동하지 않습니다.
나는이 오류에 하루 종일 보냈다.
함께 일하는 경우n-tear architecture
또는하려고separate Models
에 의해 생성 된EDMX
DataAccessLayer를 (를) 형성하십시오.DomainModelLayer
어쩌면이 오류가 발생할 것입니다.
webconfig (UILayer)
과appconfig (DataAccessLayer)
같다두 번째는 매우 중요합니다.connection string
connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provid.....
이것이 문제 다.
내가 어디에서 왔는지Model
또는 내 연결 문자열에 .csdl이 어디에 있는지
여기 나는 우리의 해결책을 그림으로 본다.
도와 주길 바래.
궁극적 인 솔루션 (EDMX 및 기타 잡화뿐만 아니라 다른 두 대의 시스템에서 데이터베이스를 다시 작성한 후에도)은 Entity Framework의 초판을 사용하지 않아야했습니다. .NET 4.0에서 다시 평가할 것을 기대합니다.
같은 문제가 발생하면다시그리고 답을 찾기 위해 모든 것을 조사해 보니 드디어 같은 문제가있는 사람을 찾았습니다. Visual Studio 마법사에서 연결 문자열을 올바르게 생성하지 못했고 메타 데이터 리소스에 대한 링크에 중요한 경로가 누락되었습니다.
v1.0 BUG? : 지정된 메타 데이터 리소스를로드 할 수 없습니다. 스크립트! = 모델
2013-01-16 업데이트: EF Code First Practice를 사용하여 거의 독점적으로 (기존 데이터베이스에서도)이 문제는 더 이상 문제가되지 않습니다. 필자에게 이것은 자동 생성 코드 및 구성에서 혼란을 줄이고 제품에 대한 자체 제어권을 늘릴 수있는 실용적인 솔루션이었습니다.
내 문제와 해결책은 증상이 "지정한 메타 데이터 리소스를로드 할 수 없음"과 동일하지만 근본 원인이 다릅니다. 솔루션 2에서 하나의 프로젝트는 EntityModel이고 나머지는 솔루션입니다. 사실 EntityModel에서 EDMX 파일을 삭제하고 다시 만들었습니다.
해결책은 웹 응용 프로그램 프로젝트로 돌아가서이 줄을 구성 파일에 추가해야한다는 것이 었습니다. 새 모델은 "다른"프로젝트의 Web.Config 파일에서 복제해야하는 몇 가지 항목을 변경했습니다. 이전 설정은 더 이상 좋지 않습니다.
<add name="MyEntities"
connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=Q\DEV15;initial catalog=whatever;
user id=myuserid;password=mypassword;
multipleactiveresultsets=True;
application name=EntityFramework""
providerName="System.Data.EntityClient" />
인터넷 검색 및 솔루션을 해결하기 위해 노력한 후 근무 제안했다. 여기 몇 가지 해결책을 나열했습니다. 나는 또한 나를 위해 일한 것을 주목했다. (필자는 EF 버전 6.1.1과 SQL 서버 2014를 사용했지만 이전 DB는 사용하고있었습니다)
connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl;
(이 파일들은 ~ / obj / .. 디렉토리 아래의 솔루션 탐색기에서 모든 파일 표시를 토글 할 수 있습니다)... 그리고 내가 시도한 많은 것 [좋아해 : EntityFramework 버전을 이후 버전으로 되 돌린다.
나를 위해 일한 것 :
이것으로부터여기에 기사, 그것은 내 문제를 해결하는 데 도움이되었습니다. 방금 나는 바꿨다.ProviderManifestToken="2012"
에ProviderManifestToken="2008"
EDMX 파일에서. 이것을하기 위해:
솔루션 탐색기
도움이되기를 바랍니다.
제 경우에는이 문제가 내 모델의 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'에 저장됩니다.
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;
}
}
여러분 모두를 위해서SelftrackingEntities
사용자,
Microsoft 워크 스루 (Walk-through)를 따라 Object Context 클래스를
Wcf 서비스 프로젝트 (컨텍스트 .tt에 연결 함)를 사용하여이 대답을 얻습니다.
이 게시물에 표시된 답변의 일부로 다음과 같은 코드가 포함되어 있습니다.
... = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
typeof(YourObjectContextType).Assembly.FullName);
당신을 위해 일하지 않을 것이다 !! 그 이유는YourObjectContextType.Assembly
이제 다른 Assembley (wcf 프로젝트 어셈블리 내부)에 상주합니다.
그럼 대체해야합니다.YourObjectContextType.Assembly.FullName
와 ->
ClassTypeThatResidesInEdmProject.Assembly.FullName
재미있어.
이것은 새로운 .edmx 디자이너를 만들기 전에 솔루션을 정리하지 않을 때 발생합니다. 새로운 .edmx 디자이너를 만들기 전에 솔루션을 정리하는 것을 잊지 마십시오. 이 기능을 사용하면 더 많은 문제를 건너 뛸 수 있습니다. 당신이 비주얼 스튜디오에서 새로운 경우 제공되는 탐색 세부 사항을 주저하십시오.
클릭 -> 빌드 -> 솔루션 정리
그런 다음 클릭 -> 빌드 -> 솔루션 재구성
희망이 도움이됩니다. 모두에게 감사드립니다.
이 같은 오류 메시지에 문제가있었습니다. 내 문제는 Visual Studio 2010을 닫았다가 다시 열어 해결되었습니다.
어셈블리의 이름을 변경했기 때문에 동일한 문제가 발생했습니다.
또한 Properties / AssemblyInfo.cs 프로젝트의 AssemblyTitle 및 AssemblyProduct 특성에서 이름을 바꾸고 edmx 파일에 대한 참조를 삭제하고 다시 추가해야했습니다.
그럼 괜찮 았어.
예외는 컴파일러가 존재하지 않는 메타 데이터를 가리키고 있으므로 복사 만하기 때문입니다.app.config
connectionstring toWeb.config
ConnectionString
또한 Rick과 동일한 문제와 해결책이있었습니다. 기존 프로젝트의 .edmx를 가져 오는 중임을 제외하고는 기본 네임 스페이스가 다른 하위 디렉토리로 가져와도 관계가 없으므로 연결을 업데이트해야했습니다. 다른 하위 디렉토리 이름 지정을 포함하도록 세 곳의 Web.Config 내부 문자열 :
솔루션 위치에있는 Mvc3AppConverter와 관련된 의심되는 버그를 극복하기 위해 솔루션 폴더로 이동 한 솔루션 폴더에 프로젝트가 포함 된 솔루션과 동일한 문제가있었습니다.
모든 * 프로젝트 참조가 필요에 따라 다시 추가 된 후에 솔루션이 컴파일되었지만 웹 사이트가 열릴 때 오류가 발생했습니다.
EDMX는 옮겨진 프로젝트 중 하나 ( '데이터'프로젝트)에 있지만 데이터 프로젝트에 대한 참조가 없기 때문에 컴파일 오류가 발생하지 않고 런타임 오류 만 발생합니다.
기본 프로젝트에 누락 된 참조를 추가하기 만하면이 문제가 해결되었으므로 연결을 전혀 편집 할 필요가 없습니다.
나는 이것이 다른 누군가를 돕기를 바랍니다.
열악한 app.config 또는 web.config 파일이이 작업을 수행 할 수 있습니다. app.config 연결 문자열을 내 UI의 web.config에 복사하여 다음과 같이 입력했습니다.
<connectionStrings>
<connectionStrings>
<add name="name" connectionString="normalDetails"/>
</connectionStrings>
</connectionStrings>
다른 프로젝트의 edmx를 사용하는 경우 연결 문자열에서 변경하십시오.
metadata=res://*/Data.DataModel.csdl
...에...
metadata=res://*/DataModel.csdl
내 이론은 동일한 이름 (예 : Model1)을 가진 edmx 파일이 두 개 이상있는 경우 해당 예외를 제공한다는 것입니다. 다른 프로젝트에 앉아있는 모든 edmx 파일을 Model1과 같은 이름으로 지정하기로 결정했을 때 동일한 문제가 발생했습니다. 왜냐하면 독립적이어야한다고 생각했기 때문입니다.
이 예외의 또 다른 원인은 관련 테이블을 ObjectQuery에 포함 시키지만 잘못된 탐색 특성 이름을 입력하는 경우입니다.
예:
var query = (from x in myDbObjectContext.Table1.Include("FKTableSpelledWrong") select x);