MetadataException:无法加载指定的元数据资源

突然间,我一直在获取一个MetadataException来实例化我生成的ObjectContext类。 App.Config中的连接字符串看起来是正确的 - 自上次工作以来没有更改过 - 并且我已经尝试从基础数据库重新生成新模型(edmx-file),但没有任何更改。

有人有主意吗?

进一步的细节:我没有改变任何属性,我没有改变任何输出程序集的名称,我没有尝试在程序集中嵌入EDMX。 我离开工作只等了10个小时,直到我回来。 然后它不再工作了。

我试过重新创建EDMX。 我试过重新创建项目。 我甚至尝试从头开始重新创建数据库。 没有运气,无论如何。


这意味着应用程序无法加载EDMX。 有几件事情会导致这种情况。

  • 您可能已将模型的MetadataArtifactProcessing属性更改为“复制到输出目录”。
  • 连接字符串可能是错误的。 我知道你说你没有改变它,但是如果你改变了其他的东西(比如说一个组件的名字),它可能仍然是错误的。
  • 您可能正在使用后编译任务将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

    下一篇: How to vertically align an image inside a div?