Anda bisa mendapatkan pengecualian ini ketika Edmx dalam satu proyek dan Anda menggunakannya dari yang lain.
Alasannya adalah Res://*/
uri yang menunjuk ke sumber daya di majelis CURRENT. Jika Edm didefinisikan dalam rakitan berbeda dari kode yang menggunakannya, res: // * / tidak akan berfungsi karena sumber daya tidak dapat ditemukan.
Alih-alih menentukan '*', Anda harus memberikan nama lengkap majelis sebagai gantinya (termasuk token kunci publik). Misalnya:
res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...
Cara yang lebih baik untuk membangun string koneksi adalah dengan 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();
}
Jika Anda masih menemukan pengecualian, buka rakitan di reflektor dan periksa nama file untuk file .csdl, .ssdl dan .msl Anda. Ketika sumber daya memiliki nama yang berbeda dengan yang ditentukan dalam nilai metadata, itu tidak akan berfungsi.