È possibile ottenere questa eccezione quando Edmx si trova in un progetto e lo si utilizza da un altro.
Il motivo è Res://*/
un uri che punta a risorse nell'assemblea ATTUALE. Se l'Edm è definito in un assembly diverso dal codice che lo sta utilizzando, res: // * / non funzionerà perché non è possibile trovare la risorsa.
Invece di specificare '*', devi fornire invece il nome completo dell'assembly (incluso il token di chiave pubblica). Per esempio:
res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...
Un modo migliore per costruire stringhe di connessione è con 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();
}
Se si riscontra ancora l'eccezione, aprire l'assemblaggio in reflector e controllare i nomi dei file per i file .csdl, .ssdl e .msl. Quando le risorse hanno nomi diversi da quelli specificati nel valore dei metadati, non funzionerà.