Sie können diese Ausnahme erhalten, wenn sich der Edmx in einem Projekt befindet und Sie ihn von einem anderen verwenden.
Der Grund ist Res://*/
ein Uri, der auf Ressourcen in der CURRENT-Assembly verweist. Wenn der Edm in einer anderen Assembly als der Code definiert ist, der ihn verwendet, funktioniert res: // * / nicht, da die Ressource nicht gefunden werden kann.
Anstatt '*' anzugeben, müssen Sie stattdessen den vollständigen Namen der Assembly angeben (einschließlich des Tokens für den öffentlichen Schlüssel). Z.B:
res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...
Eine bessere Möglichkeit zum Erstellen von Verbindungszeichenfolgen ist 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();
}
Wenn die Ausnahme weiterhin auftritt, öffnen Sie die Assembly im Reflektor und überprüfen Sie die Dateinamen für Ihre CSDL-, SSDL- und MSL-Dateien. Wenn die Ressourcen andere Namen haben als die im Metadatenwert angegebenen, funktioniert dies nicht.