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

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个回答

48

我遇到了同样的问题。 将带有EF模型的.edmx文件移动到单独的程序集后,出现了让我头疼的错误:"无法加载指定的元数据资源"。

EF版本为6.1。

解决方法:

旧值:

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

新值:

metadata=res://*/DataModel.csdl

最初,.edmx文件在项目文件夹中,我已将其移动到项目的根目录。


1
这也是我的问题,我移动了代码但是命名空间没有改变,导致元数据在错误的文件夹中查找。 - Justin
我想补充一下,我的问题是我在项目中创建了不止一个Entity Framework .edmx文件,并且恰好保留了错误的连接字符串。 - Twister1002
完美答案! - EnocNRoll - AnandaGopal Pardue
这解决了我的问题!尝试了很多其他方法来解决此问题,但最终发现只需要修复元数据属性即可。感谢你提供的完美、简短、清晰的答案。 - Nirman

19

我已解决了这个问题,部分原因是因为我的错误。我将我遇到的每个问题的解决方案列在下面,以帮助其他人。

无法加载指定的元数据资源问题

这是由于我从“EntityDeploy”将edmx模型上的“Metadata Artifact Processing”设置更改为“嵌入式资源”导致的。

这意味着它仅将整个edmx文件嵌入dll中,而不会生成ssdl、msl和csdl文件。 要使其正常工作并正确生成这些文件,必须将其设置为EntityDeploy。

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

Andrew在上面的评论中解决了这个问题,感谢他的指引。

找不到要嵌入为输入文件资源的概念模式节点

这个问题的关键在于我们的构建服务器目前使用的是Windows 2003,因此无法安装.NET 4.5。本地上,我们正在使用在VS2013上运行在.NET 4.0下的EF 6.1。

然而,出于某种原因,看起来我们需要在构建服务器上安装.NET 4.5才能进行构建,即使我们没有使用任何4.5功能并且针对.NET 4框架。暂时将EF降级到4.3解决了这个问题。虽然不理想,但它起作用了。


连接字符串"metadata=res"应该与Edmx名称相同。例如,"metadata=res://*/EmployeeModel.csdl"这个EDMX名称应该是"EmployeeModel"。 - Rajeev

16

你应该完整指定装配件名称,并在其中指定模型文件的路径(由/分隔),而不是 DLL 名称。

connectionString="metadata=res://Name.Of.The.Assembly, Culture=neutral, PublicKeyToken=8e2e51fcf4cf363e/Payment.PaymentModel.csdl|.........."

ssdlmsl同样适用。


感谢您的回复,但我尝试了那个方法后,我回到了最初的 "无法加载指定的元数据资源" 错误 - 因此也许 "无法解析程序集" 只是一个分散注意力的问题。 - Steve Newstead
这与您命名模型的方式、它所在的命名空间以及从连接字符串中引用它的方式有关。 - Andrew

13

我遇到了同样的问题。

System.Data.MetadataException: 无法加载指定的元数据资源

结果发现之前生成的连接字符串中包含所有edmx文件的名称。我将连接字符串中的所有模型名称都删除,只留下以下字符串作为我的元数据:

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

这对我起作用了。


运行得非常顺利! - Raihan Ridoy

12

更改元数据

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

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

上述更改将解决这个问题


这给了我一个错误,说我正在尝试创建edmx文件...我认为这是针对数据库优先方法的.... - Moi Hawk

8
解决方案: 1)从Visual Studio打开.edmx文件。 2)单击任意位置。 3)应该看到edmx属性窗口。 4)将命名空间更改为正确的文件夹名称。 5)图片链接:1https://istack.dev59.com/6sZvo.webp(点击图片查看更多细节)。

6

如果您正在使用dotnet CLI

对于使用新的dotnet build工具构建基于Entity Framework 6.x的项目的新访客,请注意,它当前不会将任何元数据嵌入到最终构建中。因此,如果您在VS中运行它,它将运行,但是如果您的CI脚本使用dotnet,那么它们将在服务器上失败,直到您切换回msbuild。我个人认为这是一个错误,应该由工具来处理。如果需要,您可以在GitHub线程上发表意见。


4
我之前也遇到了同样的错误,因为我的 Entity Framework 连接字符串指向了一个有效的数据库,但却是不正确的数据库。
如果你在 SQL Server 中有以下实例:
- MyDatabase1 - MyDatabase2
请确保连接字符串指向与 .EDMX 相同的数据库并且从中生成。这似乎很明显,但当从一个项目复制 EF 连接设置到另一个项目时,可能会出现这种错误,导致出现 "无法加载指定的元数据资源" 的消息。一旦我使用了正确的连接字符串指向正确的数据库和程序集,该错误就得到了解决。
最简单的方法是获取位于 .EDMX 旁边的 .config 文件中创建的原始连接字符串,并将其复制到需要的位置,以确保没有造成微小疏漏或错误,导致 EF 不能正确加载/连接。

2

我也遇到了同样的错误。我的连接字符串如下:

 <add name="EmployeeDbContext" connectionString="metadata=res://*/EmployeeModel.csdl|res://*/EmployeeModel.ssdl|res://*/EmployeeModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=Sample;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

我将其更改为以下内容,问题得以解决。

<add name="EmployeeDbContext" connectionString="server=.; database=Sample; integrated security=true;"
       providerName="System.Data.SqlClient"/>

2
此外,当将edmx文件从Web应用程序移动到数据层(web.config - connection / app.config - connection)时,请注意更改数据层和Web服务层中的connectionstring。否则,将使用两个不同的连接字符串,这会导致此类问题。

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