Vous pouvez obtenir cette exception lorsque l'Edmx se trouve dans un projet et que vous l'utilisez dans un autre.
La raison est Res://*/
un uri qui pointe vers des ressources dans l'assembly CURRENT. Si l'Edm est défini dans un assembly différent du code qui l'utilise, res: // * / ne fonctionnera pas car la ressource est introuvable.
Au lieu de spécifier '*', vous devez fournir le nom complet de l'assembly à la place (y compris le jeton de clé publique). Par exemple:
res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...
Une meilleure façon de construire des chaînes de connexion est avec 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();
}
Si vous rencontrez toujours l'exception, ouvrez l'assembly dans le réflecteur et vérifiez les noms de fichiers pour vos fichiers .csdl, .ssdl et .msl. Lorsque les ressources ont des noms différents de ceux spécifiés dans la valeur des métadonnées, cela ne fonctionnera pas.