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

有人有什么想法吗?

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

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


当前回答

我也遇到了类似的问题。我的类名与我的文件名不同。生成的connectionstring中包含类名而不是文件名。对我来说,解决方案就是重命名我的文件以匹配类名。

其他回答

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

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

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

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

我改为:

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

在我的情况下,这个问题与重命名我的模型的edmx文件有关…修正app.config连接字符串的csdl/ssdl/msl文件修复了我的问题。

如果您使用EF 4.0设计器来生成csdl/ssdl/msl,这3个“文件”实际上将存储在模型的主edmx文件中。在这种情况下,瓦卡斯的帖子几乎是正确的。重要的是要理解他示例中的“Model_Name”将需要更改为模型的.edmx文件的当前名称(不包含.edmx)。

此外,如果edmx文件不在项目的根级别,则需要在Model_Name前面加上相对路径,例如:

res://*/MyModel.WidgetModel.csdl|res://*/MyModel.WidgetModel.ssdl|res://*/MyModel.WidgetModel.msl

将指定csdl/ssdl/msl xml存储在模型文件'WidgetModel。它存储在名为“MyModel”的文件夹中。

使用这篇博文中的信息:

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

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

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

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

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

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