Bạn có thể có ngoại lệ này khi Edmx nằm trong một dự án và bạn đang sử dụng nó từ một dự án khác.
Lý do là Res://*/
một uri trỏ đến các tài nguyên trong hội đồng HIỆN TẠI. Nếu Edm được định nghĩa trong một hội đồng khác với mã đang sử dụng nó, res: // * / sẽ không hoạt động vì không thể tìm thấy tài nguyên.
Thay vì chỉ định '*', bạn cần cung cấp tên đầy đủ của hội đồng thay thế (bao gồm mã thông báo khóa công khai). Ví dụ:
res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...
Cách tốt hơn để xây dựng chuỗi kết nối là với 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();
}
Nếu bạn vẫn gặp ngoại lệ, hãy mở cụm trong phản xạ và kiểm tra tên tệp cho các tệp .csdl, .ssdl và .msl của bạn. Khi tài nguyên có tên khác với tên được chỉ định trong giá trị siêu dữ liệu, nó sẽ không hoạt động.