实体框架 - 无法加载指定的元数据资源

39

我知道这个问题已经被问了很多次,但我似乎无法解决我的问题。 我得到了以下错误堆栈:

在此输入图像描述

当我反射我的dll时,我可以看到以下内容

在此输入图像描述

阅读http://blogs.teamb.com/craigstuntz/2010/08/13/38628/建议我应该在这里看到csdl、msl和ssdl文件,但它们不存在。 不过,它们确实存在于 obj\Debug\edmxResourcesToEmbed 中。

尽管如此,我仍然尝试通过执行以下操作显式地告诉web.config在哪里查找:

...connectionString="metadata=res://DllName.dll/PaymentModel.csdl|res://DllName.dll/PaymentModel.ssdl|res://DllName.dll/PaymentModel.msl;provider=System.Data.SqlClient;provider ... />

代码抛出错误,指出无法找到dll文件:

无法解析程序集 'DllName.dll'。

与这个未解决的SO问题非常相似 Unable to resolve assembly Model.dll

我最后尝试的方法是将元数据行更改为:

...connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider ... />

这里出现了一个关于 SQL CE 的消息,而我并没有使用它 - 有没有办法解决这个问题?

enter image description here

我能尝试些什么别的吗?或者有人能看出我错在哪里吗?以下是一些额外的细节:

  • 使用EF 6 EDMX设置为“嵌入资源”

  • 复制到输出目录:“不复制”

  • 元数据工件处理:“嵌入到输出程序集中”

最后,在将EDMX从嵌入式资源设置为EntityDeploy时,这将在本地工作,但在构建服务器上构建时会引发与此 SO 问题完全相同的错误:

Could not find the Conceptual Schema node to embed as a resource for input file

但修复似乎没有帮助,而且我不能在服务器上安装 .NET 4.5 版本。


1
当我将我的模型从项目的根目录移动到名为“Model”的子文件夹中时,我遇到了一些问题。当我将它放回原来的位置时,问题消失了。 - Glenn Ferrie
我重新启动了电脑,然后它又开始工作了。 - AlbatrossCafe
17个回答

2
我正在与另一位开发人员共享我的代码,他遇到了这个问题。没有连接字符串的差异,所有文件都没问题... 我通过设置
  • 元数据工件处理从:"嵌入输出程序集" 到 "复制到输出目录",
  • 重新构建项目,
  • 然后再将其设置回来。
解决了这个问题。
我认为这个方法有效是因为当使用“复制到输出目录”时,单独的文件(CSDL/MSL/SSDL文件)会在输出目录中创建。显然有一个错误需要它们才能使嵌入版本正常工作。
希望这可以帮助 :)

我正在使用VS2022(如果相关的话),但是没有“复制到输出目录”的选项。 - Post Impatica
没关系,我的解决方案在下面被接受为答案了。花了我一些时间,因为我一直尝试最新的答案。 - Post Impatica

2
连接字符串"metadata=res"应该与Edmx名称相同。例如:
metadata=res://*/EmployeeModel.csdl 

这个 EDMX 的名称应该是 EmployeeModel


1
我想分享一下我的经验以及我是如何解决这个问题的。在我的情况下,这是因为我在生产服务器上复制并粘贴了我的连接字符串。我的应用程序正在使用实体框架。

问题出在元数据上

我将我的实体模型命名为'BetModel',但在我的连接字符串中我使用的是'Entity' - 'res:///Entity.csdl|res:///Entity.ssdl|res://*/Entity.msl' 在'metadata'(原因是因为我复制粘贴了它)。
所以我的错误ConnectionString是:
connectionString="metadata=res://*/Entity.csdl|res://*/Entity.ssdl|res://*/Entity.msl;provider=System.Data.SqlClient;provider connection string="data source=;initial catalog=;persist security info=True;user id=;password=;MultipleActiveResultSets=True;App=EntityFramework""

而正确的 ConnectionString 是:

<add name="BetEntities" connectionString="metadata=res://*/BetModel.csdl|res://*/BetModel.ssdl|res://*/BetModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=;initial catalog=;persist security info=True;user id=;password=;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

1
我遇到了这个问题,它已经困扰了我很多次,而且我总是忘记如何解决它。
我所要做的就是将default.aspx设置为起始页。
显然,这并不能帮助每个人,但在我的情况下,我已经检查了我的配置、连接字符串等等。
希望这能帮助某些人,或者至少下一次我谷歌它时能找到我的解决方案。 :)

  1. 你在哪里设置起始页?
  2. 起始页与EF元数据资源有什么关联?
- Arturo Torres Sánchez
@ArturoTorresSánchez - 在解决方案资源管理器中右键单击页面,然后单击“设置为启动页”。我不知道它的关联。如果没有选择启动页,我不知道 Visual Studio 在启动时会默认使用哪个页面。 - Gina Marano

1

我在Visual Studio 2013中使用了EF6。我是通过以下步骤解决的。

  • 右键单击实体模型
  • 打开XML(文本)编辑器
  • 在标签中设置 ProviderManifestToken="2008"
  • 构建解决方案

希望对你有用。


太好了!在VS 2013中打开来自VS 2015的项目时可以工作。 - Vishnoo Rath

0
我在从源代码控制中心拉取代码后,在开发机器之间移动时遇到了这个问题多次。通常,我只需要显式地使用包含EDMX文件的项目重新构建即可。

0
如果您正在尝试使用多个EDMX文件,并且由于冲突必须将新的EDMX文件放在其自己的命名空间中,请注意创建EDMX文件时向导显示的元数据。那一个是正确的。
然后,如果您正在使用EntityConnectionStringBuilder并设置元数据,请确保考虑新的命名空间。
这里的任何答案都没有帮助我,因为我有: /EDMX1 /Namespace/EDMX2
虽然EDMX1的元数据为"edmx1.csdl|edmx1.ssdl|edmx1.msl" 但是EDMX2的元数据为"Namespace.edmx2.csdl ..."

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接