关于c#:Entity Framework – 无法加载指定的元数据资源

Entity Framework - Unable to load the specified metadata resource

我意识到这已经被问过很多次了,但我似乎无法弄清我的问题到底是什么。我得到以下错误堆栈:

enter image description here

当我反映出我的动态链接库时,我可以看到以下内容

enter image description here

阅读http://blogs.teamb.com/craigstuntz/2010/08/13/38628/它建议我希望在这里看到csdl、msl和ssdl文件,但它们不是。它们确实存在于objdebugedmxresourcestoembed中。

我尽量通过这样做来明确地告诉web.config在哪里查找:

1
...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"。

与此非常相似,所以问题无法解析assembly model.dll

最后我尝试将元数据行更改为:

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

这就抛出了一条关于我不使用的SQL CE的消息——有没有解决这个问题的方法??

enter image description here

还有什么我可以尝试的吗?或者有人能看到我哪里出错了吗?一些额外的细节:

  • 使用ef 6 edmx设置为"嵌入资源"

  • 复制到输出目录:"不复制"

  • 元数据工件处理:"嵌入到输出中汇编

最后,如果我将EDMX从Embedded Resource设置为EntityDeploy,那么这将在本地工作,但不会在生成服务器上生成,因为它会引发与此完全相同的错误,因此问题:

找不到要作为输入文件的资源嵌入的概念架构节点

但修复似乎没有帮助,很遗憾,我无法在服务器上安装.NET 4.5。


我也有同样的问题。在将带有ef模型的.edmx文件移动到单独的程序集之后,上述错误引起了我的头痛:"无法加载指定的元数据资源"。

EF版本6.1

解决方案:

旧价值:

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

新价值:

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

最初,edmx在项目的文件夹下,我已经将它移到了项目的根目录中。


所以,我得说清楚,部分原因是我的错。我会把我在下面遇到的每个问题的解决方案,以防它帮助任何其他人。

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

这是由我将EDMX模型上的"元数据工件处理"设置从"EntityDeploy"设置为"Embedded Resource"引起的。

这意味着它只是将整个EDMX文件嵌入到DLL中,而不是生成ssdl、msl和csdl文件。

我想您必须将其设置为EntityDeploy,这样才能正常工作并生成这些文件。很有道理,我们的坏处就在这里。

无法解析程序集"dllname.dll"

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

找不到要作为输入文件的资源嵌入的概念架构节点

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

然而,出于某种原因,我们似乎需要在构建服务器上安装.NET 4.5才能构建它,即使我们没有使用任何4.5功能并以.NET 4框架为目标。

把EF降到4.3在短期内解决了这个问题。不太理想,但效果不错。


您应该指定程序集的完全限定名和模型文件的路径(由/分隔),而不是dll名称

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

同适用于ssdlmsl


更改元数据

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

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

以上更改将解决此问题


解决方案:1)从Visual Studio打开.edmx文件。2)点击任意位置。3)应参见EDMX属性窗口。4)将命名空间更改为正确的文件夹名称。5)1:https://i.stack.imgur.com/6szvo.png(详细信息请选择图片)。


我也有同样的问题

System.Data.MetadataException: Unable to load the specified metadata resource

结果显示,之前生成的连接字符串上有所有edmx的名称。我从连接字符串中取出了所有模型名称,只在元数据中留下下面的字符串

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

这对我很有用。


如果您使用的是dotnetcli

对于使用新的dotnet build工具来构建基于实体框架6.x的项目的新访问者,要知道它目前没有在最终构建中嵌入任何元数据。因此,如果从vs内部运行,它将运行,但是如果您的CI脚本使用dotnet,那么它们将在服务器上失败,直到您切换回msbuild。imho,这是一个bug,工具应该处理它。如果需要,可以在Github线程上发出蜂鸣音。


实际上,我收到了同样的错误,因为我的Entity Framework连接字符串指向一个有效的数据库,但它是不正确的数据库。

如果您在SQL Server中有以下实例:

  • MyDabase1
  • MyDabase2

确保连接字符串指向与.EDMX连接并由其生成的同一数据库。看起来很明显,但是当从一个项目复制EF连接设置到另一个项目时,出现了这个错误,最终结果是Unable to load the specified metadata resource消息。一旦我使用正确的连接字符串指向正确的数据库和程序集,错误就解决了。

最简单的方法是使用位于.EDMX旁边的.config文件中创建的原始连接字符串,并在需要时进行复制,以确保不会出现细微或轻微的遗漏/错误,从而导致EF无法正确加载/连接。


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

1
 

我把它改成following,它解决了这个问题。

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

此外,在将EDMX文件从Web应用程序移动到数据层(web.config-connection/app.config-connection)时,请注意更改数据层和WebService层中的ConnectionString。(另外一个使用两个不同的连接字符串,这会导致这样的问题)


连接字符串"metadata=res"应与edmx name相同。如

1
metadata=res://*/EmployeeModel.csdl

此EDMX名称应为EmployeeModel


我碰到这个问题,它咬了我很多次,很多次,很多次,我总是忘记如何解决它。

我所要做的就是将default.aspx设置为起始页。

显然,这对每个人都没有帮助,但在我的例子中,我已经在检查我的配置、连接字符串……

希望这能帮助别人,或者至少下次我用谷歌搜索它时,我会找到我的解决方法。:)


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

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

希望它对你有用……


在从源代码管理中提取代码后,在开发机器之间移动时,我已经多次遇到这种情况。我通常只需要用其中的EDMX文件显式地重新构建项目。


我想分享我在这方面的经验以及我如何解决它。在我的例子中,发生这种情况是因为我复制并粘贴了生产服务器上的连接字符串。我的应用程序正在使用实体框架。

Problem was on metadata

我将我的实体模型命名为"Betmodel",但在连接字符串中,我使用的是"entity"-"res:///entity.csdl res:///entity.ssdl res:///entity.msl"on"metadata"(原因是我复制粘贴了它)。

所以我的错误连接字符串是:

1
connectionString="metadata=res://*/Entity.csdl|res://*/Entity.ssdl|res://*/Entity.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;"

正确的连接字符串是:

1
 

我正在与另一个开发人员共享我的代码,他遇到了这个问题。没有连接字符串差异。所有文件都正常…我通过设置修复了它

  • 元数据工件处理从:"嵌入输出程序集"到"复制到输出目录",
  • 重建项目,
  • 然后再把它放回去。

我认为这是可行的,因为当使用"复制到输出目录"时,在输出目录中创建了单个文件(csdl/msl/ssdl文件)。显然有一个bug需要嵌入版本才能工作。希望这有帮助:)