突然,在实例化生成的ObjectContext类时,我一直得到一个MetadataException。App.Config中的连接字符串看起来是正确的-自从上次它工作以来没有改变-我已经尝试从底层数据库中重新生成一个没有变化的新模型(edmx-file)。

有人有什么想法吗?

进一步的细节:我没有更改任何属性,没有更改任何输出程序集的名称,也没有尝试将EDMX嵌入到程序集中。我只是下班后等了10个小时才回来。然后它就不管用了。

我试过重新创造EDMX。我试着重新创建这个项目。我甚至尝试从头开始重新创建数据库。不管怎样,运气不好。


当前回答

我也有同样的问题。我用反射器查看了我的编译dll,发现资源的名称是不正确的。我重新命名了,现在看起来很好。

其他回答

我编写了这个helper类,当ObjectContext对象定义在与使用它的项目不同的项目中时,它可以创建对象的实例。我解析配置文件中的连接字符串,并将'*'替换为完整的程序集名称。

它并不完美,因为它使用反射来构建对象,但这是我能找到的最通用的方法。

希望它能帮助到别人。

public static class EntityHelper<T> where T : ObjectContext
{
    public static T CreateInstance()
    {
        // get the connection string from config file
        string connectionString = ConfigurationManager.ConnectionStrings[typeof(T).Name].ConnectionString;

        // parse the connection string
        var csBuilder = new EntityConnectionStringBuilder(connectionString);

        // replace * by the full name of the containing assembly
        csBuilder.Metadata = csBuilder.Metadata.Replace(
            "res://*/",
            string.Format("res://{0}/", typeof(T).Assembly.FullName));

        // return the object
        return Activator.CreateInstance(typeof(T), csBuilder.ToString()) as T;
    }
}

如果您正在使用来自不同项目的edmx,那么在连接字符串中,更改…

metadata=res://*/Data.DataModel.csdl

……

metadata=res://*/DataModel.csdl

对我来说,我把数据访问层和用户界面层分开了。 每一层都有实体连接字符串。

在我将这两个分离的连接字符串修改为相同之前,我仍然发现下面的错误。

Unable to load the specified metadata resource

所以我让这两个层(DAL, UI)是相同的连接字符串,它的工作完美。

我的解决方案是使所有的连接字符串是相同的,无论他们已经提出。

我在反思一个旧程序时,遇到了同样的问题。我浏览了之前的答案,我成功地解决了这个问题,我把“Model.”的3个文件。csdl”、“模型。ssdl”和“模型。在bin目录中,也在实体类的旁边。 之后修改web中实体连接字符串的元数据部分。配置为:

metadata=~/bin/Model.csdl|~/bin/Model.ssdl|~/bin/Model.msl

程序运行成功,显示此异常。

一个小小的修改帮我解决了这个问题。

我有3个项目参考资料的解决方案:

connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;

我改为:

connectionString="metadata=res://*/;