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