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

有人有什么想法吗?

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

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


当前回答

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

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

其他回答

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

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

使用这篇博文中的信息:

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

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

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

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

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

对于所有SelftrackingEntities用户, 如果您已经遵循Microsoft演练并将Object上下文类分离为 WCF服务项目(通过链接到上下文.tt)所以这个答案是给你的:

这篇文章中显示的部分答案包括如下代码:

... = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName); 

对你没用!!原因是youobjectcontexttype。程序集现在驻留在不同的程序集(在wcf项目程序集内),

你应该用——>替换youobjectcontexttype。assembly。fullname

ClassTypeThatResidesInEdmProject.Assembly.FullName 

玩得开心。

在我的情况下,列出的答案没有一个是有效的,所以我发布了这个。

For my case, building on Visual studio and running it with IIS express worked fine. But when I was deploying using Nant scripts as a stand-alone website was giving errors. I tried all the suggestions above and then realized the DLL that was generated by the nant script was much smaller than the one generated by VS. And then I realized that Nant was unable to find the .csdl, .msl and .ssdl files. So then there are really two ways to solve this issue, one is to copy the needed files after visual studio generates them and include these files in the build deployment. And then in Web.config, specify path as:

"metadata=~/bin/MyDbContext.csdl|~/bin/MyDbContext.ssdl|~/bin/MyDbContext.msl;provider=System.Data.SqlClient;...."

这是假设您已经手动复制文件到您正在运行的网站的bin目录。如果它在不同的目录中,则相应地修改path。 第二种方法是在Nant脚本中执行EdmGen.exe,并生成文件,然后将它们作为资源,如下例所示: https://github.com/qwer/budget/blob/master/nant.build

我的理论是,如果您有多个同名的edmx文件(例如Model1),它将给出该异常。 当我决定将所有edmx文件(位于不同的项目中)命名为Model1时,我也遇到了同样的问题,因为我认为它们应该是独立的。