Você pode obter essa exceção quando o Edmx está em um projeto e o está usando em outro.
O motivo é Res://*/
um uri que aponta para recursos na montagem ATUAL. Se o Edm estiver definido em um assembly diferente do código que está sendo usado, res: // * / não funcionará porque o recurso não pode ser encontrado.
Em vez de especificar '*', é necessário fornecer o nome completo do assembly (incluindo o token de chave pública). Por exemplo:
res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...
Uma maneira melhor de construir cadeias de conexão é com 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 você ainda encontrar a exceção, abra a montagem no refletor e verifique os nomes dos arquivos para os arquivos .csdl, .ssdl e .msl. Quando os recursos tiverem nomes diferentes dos especificados no valor dos metadados, não funcionará.