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

有人有什么想法吗?

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

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


当前回答

一个糟糕的app.config或web。配置文件可以做到这一点..我已经复制了app.config连接字符串到我的web。在我的UI中配置,最终进入:

<connectionStrings>
    <connectionStrings>
          <add name="name" connectionString="normalDetails"/>
    </connectionStrings>
</connectionStrings>

其他回答

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

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

……

metadata=res://*/DataModel.csdl

我只是没有引用包含EDMX文件的类库。

对于我的案例,它是通过改变edmx文件的属性来解决的。

打开edmx文件 右键单击EDMX设计器的任意位置 选择属性 将名为“元数据工件处理”的属性更新为“嵌入输出程序集”

这为我解决了问题。 问题是,当容器试图找到元数据时,它找不到它。所以只要在同一个装配中就可以了。 如果您的edmx文件在另一个程序集中,则此解决方案将不起作用

异常是因为编译器指向不存在的元数据,所以只是复制app.config连接字符串到Web。配置ConnectionString

使用这篇博文中的信息:

就像其他人说的,res:\\是指向资源的指针。要检查并确保您的资源名称是正确的,您可以使用JetBrains的DotPeek等反编译器打开您的.dll文件并查看资源文件。

或者,您可以在调试时打开监视窗口并粘贴此代码,以获得当前正在执行的程序集中的资源名称数组。

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()

也就是说,元数据路径的格式应该是这样的:

{my-assembly-name} / {possibly-a-namespace},{类名称}。{csdl or SSDL or msl}