Edmxが1つのプロジェクトにあり、それを別のプロジェクトから使用している場合、この例外が発生する可能性があります。
その理由は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ファイルのファイル名を確認してください。リソースの名前がメタデータ値で指定されたものと異なる場合、リソースは機能しません。