MetadataException:无法加载指定的元数据资源
突然间,我一直在获取一个MetadataException
来实例化我生成的ObjectContext
类。 App.Config中的连接字符串看起来是正确的 - 自上次工作以来没有更改过 - 并且我已经尝试从基础数据库重新生成新模型(edmx-file),但没有任何更改。
有人有主意吗?
进一步的细节:我没有改变任何属性,我没有改变任何输出程序集的名称,我没有尝试在程序集中嵌入EDMX。 我离开工作只等了10个小时,直到我回来。 然后它不再工作了。
我试过重新创建EDMX。 我试过重新创建项目。 我甚至尝试从头开始重新创建数据库。 没有运气,无论如何。
这意味着应用程序无法加载EDMX。 有几件事情会导致这种情况。
总之,你的问题中没有足够的细节来给出准确的答案,但希望这些想法能让你走上正确的轨道。
更新:我写了一篇博文,提供更完整的步骤进行故障排除。
这个小改动有助于解决这个问题。
我有3个项目的解决方案。
connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;
改成
connectionString="metadata=res://*/;
当Edmx在一个项目中并且您正在使用另一个项目时,可以获得此异常。
原因是Res://*/
是一个指向CURRENT程序集中资源的URI。 如果Edm在与使用它的代码不同的程序集中定义,则res:// * /将不起作用,因为找不到该资源。
代替指定'*',您需要提供程序集的完整名称(包括公钥标记)。 例如:
res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...
构建连接字符串的更好方法是使用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();
}
如果仍然遇到异常,请在反射器中打开程序集并检查.csdl,.ssdl和.msl文件的文件名。 当资源与元数据值中指定的名称不同时,它不起作用。
链接地址: http://www.djcxy.com/p/6615.html上一篇: MetadataException: Unable to load the specified metadata resource