Ви можете отримати цей виняток, коли Edmx знаходиться в одному проекті, а ви використовуєте його в іншому.
Причина - Res://*/
урі, який вказує на ресурси в СУЧАСНІЙ збірці. Якщо 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. Коли ресурси мають різні імена до тих, які вказані у значенні метаданих, це не спрацює.