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

有人有什么想法吗?

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

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


当前回答

只需输入path,而不是{path . to . path。}: res: / / / {Path.To.The。}YourEdmxFileName.csdl | res: / / / {Path.To.The。}YourEdmxFileName.ssdl | res: / / * / {Path.To.The。}YourEdmxFileName.msl

其他回答

只需输入path,而不是{path . to . path。}: res: / / / {Path.To.The。}YourEdmxFileName.csdl | res: / / / {Path.To.The。}YourEdmxFileName.ssdl | res: / / * / {Path.To.The。}YourEdmxFileName.msl

经过数小时的谷歌搜索和尝试解决建议的解决方案没有一个有效。我在这里列出了几个解决方案。我也注意到了对我有用的方法。(我使用的是EF版本6.1.1,SQL server 2014 -但旧的DB)

重新构建项目并重试。 关闭和打开VS -我不知道这是怎么回事 确保如果你已经把。edmx文件放在一个目录中,确保你在你的连接字符串中包含了目录。例如,我的是在DAL文件夹。所以它看起来是这样的:connectionString="metadata=res://*/ dal . nammodel .csdl|res://*/ dal . nammodel .ssdl|res://*/ dal . nammodel .msl;你可以在解决方案资源管理器中切换显示所有文件,在~/obj/..目录)

...以及更多我尝试过的方法[比如:将EntityFramework版本恢复到后来的版本(不确定)]


对我有用的是:

这篇文章帮助我解决了我的问题。我只是在EDMX文件中将我的ProviderManifestToken=“2012”更改为ProviderManifestToken=“2008”。这样做:

解决方案资源管理器

右键单击文件。edmx 开放与. . XML编辑器 使用2008更改ProviderManifestToken="XXXX"

我希望这对你有所帮助。

在将一个大的解决方案从源代码管理资源管理器的一个文件夹移动到另一个文件夹后,我得到了这个问题。我们没有把包文件夹检查到Team Foundation,所以我认为VS会自动下载包。这将我的EF表单v6.1.2升级到v6.1.3。

当我降级到最初的v6.1.2时,这个问题就消失了。

我从解决方案中的所有项目中删除了\bin和\obj文件夹,然后重新构建解决方案,它工作得很好

我编写了这个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;
    }
}