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

时间:2014-04-28 10:59:54

标签: c# entity-framework entity-framework-6

我意识到这已被多次询问,但我似乎无法解决问题的根源。我收到了以下错误堆栈:

enter image description here

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

enter image description here

阅读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从Embedded Resource设置为EntityDeploy,那么这将在本地工作但不在构建服务器上构建,因为它会抛出与此SO问题完全相同的错误:

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

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

17 个答案:

答案 0 :(得分:41)

我遇到了同样的问题。 使用EF模型移动.edmx文件以分离程序集提到的错误导致我头痛:“无法加载指定的元数据资源”。

EF版本6.1

解决方案:

旧值:

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

新价值:

metadata=res://*/DataModel.csdl

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

答案 1 :(得分:15)

所以我已经到底了,部分我认为这是我的错。我会在下面遇到的每个问题上提出解决方案,以防其他人帮助。

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

这是因为我在edmx模型上设置'元数据工件处理' 设置来自" EntityDeploy" to" Embedded Resouce"。

所以这意味着它只是将整个edmx文件嵌入到dll中,而不是生成ssdl,msl和csdl文件。

我想你必须将它设置为EntityDeploy才能正常工作并生成这些文件。在这里做出完美的感觉和我们的坏事。

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

这是安德鲁在上面的评论中解决的,感谢指针。

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

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

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

降级至EF至4.3在短期内为我们解决了这个问题。不理想,但它有效。

答案 2 :(得分:12)

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

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

ssdlmsl

相同

答案 3 :(得分:9)

更改元数据

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

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

上述更改将解决问题

答案 4 :(得分:6)

解决方案:
1)从visual studio打开.edmx文件 2)点击任意位置 3)应该看到edmx属性窗口 4)将命名空间更改为正确的文件夹名称 5)1https://i.stack.imgur.com/6sZvo.png(选择图片了解更多详情)。

答案 5 :(得分:5)

我遇到了同样的问题

  

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

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

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

这对我有用。

答案 6 :(得分:5)

如果您使用的是pymysql CLI

对于使用新dotnet工具构建基于Entity Framework 6.x的项目的较新访问者,请知道它当前does NOT embed any metadata进入最终构建。因此,如果您在VS中运行它将运行,但如果您的CI脚本使用dotnet build,那么它们将在服务器上失败,直到您切换回dotnet。恕我直言,这是一个错误,工具应该处理这个问题。如果需要,你可以在GitHub线程上编钟。

答案 7 :(得分:3)

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

如果SQL Server中有以下实例:

  • MyDatabase1
  • MyDatabase2

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

最简单的方法是将{em>原始连接字符串放在.config文件中创建的.EDMX文件中,并在必要时复制,以确保细微或轻微的遗漏/错误未导致EF无法正确加载/连接。

答案 8 :(得分: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"/>

答案 9 :(得分:2)

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

答案 10 :(得分:1)

我在我的visual studio 2013中使用过EF6。我已经通过以下步骤解决了这个问题。

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

希望它对你有用..

答案 11 :(得分:1)

我遇到了这个问题,它有很多很多次,我总是忘记我是如何修复它的。

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

显然这对每个人都没有帮助,但在我的情况下,我已经走了检查我的配置,连接字符串......

希望这有助于某人,或者至少在我下次谷歌时,我会找到我的修复方法。 :)

答案 12 :(得分:1)

连接字符串“metadata = res”应与Edmx名称相同。例如

metadata=res://*/EmployeeModel.csdl 

此EDMX名称应为 EmployeeModel

答案 13 :(得分:0)

在从源代码管理中删除代码后,在开发机器之间移动时,我已经多次这样做了。我通常只需使用EDMX文件显式重建项目。

答案 14 :(得分:0)

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

  

问题在于元数据

我将实体模型命名为“BetModel”,但在我的连接字符串中,我使用的是“实体” - “res:// /Entity.csdl|res:// /Entity.ssdl|res://*/Entity.msl'关于'元数据'(原因是因为我复制粘贴了它)。

所以我错误的ConnectionString是:

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;"

并且更正的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" />

答案 15 :(得分:0)

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

修复了它
  • 元数据工件处理来自:&#34;嵌入输出组件&#34;到&#34;复制到输出目录&#34; ,
  • 重建项目,
  • 然后再将其重新设置。

我认为这是有效的,因为单个文件(CSDL / MSL / SSDL文件)是在使用&#34;复制到输出目录&#34;时在输出目录中创建的。显然有一个错误需要它们才能使嵌入式版本工作。 希望这会有所帮助:)

答案 16 :(得分:0)

如果您尝试使用多个EDMX文件,并且由于冲突而不得不将新的EDMX文件放置在其自己的名称空间中,那么在创建EDMX文件时,请注意向导显示的元数据。那是正确的。

然后,如果您使用EntityConnectionStringBuilder并在那里设置元数据,请确保考虑新的名称空间。

这里的答案都没有像我一样帮助我: / EDMX1 /名称空间/ EDMX2

,而EDMX1的元数据为“ edmx1.csdl | edmx1.ssdl | edmx1.msl” EDMX2的元数据为“ Namespace.edmx2.csdl ...”