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

Posted

技术标签:

【中文标题】实体框架 - 无法加载指定的元数据资源【英文标题】:Entity Framework - Unable to load the specified metadata resource 【发布时间】:2014-06-13 21:30:16 【问题描述】:

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

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

阅读http://blogs.teamb.com/craigstuntz/2010/08/13/38628/ 表明我希望在这里看到 csdl、msl 和 ssdl 文件,但事实并非如此。它们确实存在于 obj\Debug\edmxResourcesToEmbed 中。

Never-the-less 我试图通过这样做明确告诉 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 的消息 - 有没有办法解决这个问题??

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

使用设置为“嵌入式资源”的 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。

【问题讨论】:

当我将我的模型从项目的根目录移动到一个名为“Model”的子文件夹中时,我遇到了思考问题,当我将它放回它开始的位置时,问题就消失了 我重新启动了我的电脑,它又开始工作了...... 【参考方案1】:

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

EF 6.1 版

解决方案:

旧值:

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

新值:

metadata=res://*/DataModel.csdl

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

【讨论】:

这也是我的问题,我已经移动了代码并且命名空间没有改变,所以元数据在错误的文件夹中查找。r 我要补充一点,我的问题是我在我的项目中创建了多个实体框架 .edmx,因此我碰巧保留了不正确的连接字符串。 完美答案! 这解决了我的问题!做了很多其他事情来解决这个问题,但最终都是关于修复元数据属性。感谢您提供完美、简短、甜美和清晰的答案。【参考方案2】:

所以我已经追根溯源了,部分原因是我认为这是我的错。我将在下面列出我遇到的每个问题的解决方案,以防对其他人有所帮助。

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

这是由于我将 edmx 模型上的 '元数据工件处理' 设置从“EntityDeploy”设置为“Embedded Resouce”。

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

我猜您必须将其设置为 EntityDeploy 才能正常工作并正确生成这些文件。完全有道理,我们在这里不好。

无法解析程序集“DllName.dll”

Andrew 在上面的 cmets 中解决了这个问题,感谢您的指点。

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

整个问题的关键在于,我们的构建服务器目前在 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"【参考方案3】:

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

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

ssdlmsl 相同

【讨论】:

感谢您的回复,如果我尝试返回原始的无法加载指定的元数据资源。错误 - 所以可能无法解决程序集是一个红鲱鱼。 这与你如何命名你的模型、它所在的命名空间以及你如何从连接字符串中引用它有关【参考方案4】:

更改元数据

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

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

以上更改将解决问题

【讨论】:

这给了我一个错误,说我正在尝试创建 edmx 文件......我认为这是数据库优先的方法......【参考方案5】:

我也遇到了同样的问题

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

原来之前生成的连接字符串上包含了所有 edmx 的名称。 我从连接字符串中取出所有模型名称,在我的元数据中只留下以下字符串

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

这对我有用。

【讨论】:

工作就像一个魅力!【参考方案6】:

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

【讨论】:

【参考方案7】:

如果您使用的是dotnet CLI

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

【讨论】:

【参考方案8】:

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

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

我的数据库1 我的数据库2

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

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

【讨论】:

【参考方案9】:

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

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

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

metadata=res://*/EmployeeModel.csdl 

此 EDMX 名称应为 EmployeeModel

【讨论】:

【参考方案12】:

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

元数据工件处理从:“嵌入输出程序集”到“复制到输出目录”, 重建项目, 然后重新设置。

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

【讨论】:

【参考方案13】:

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

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

显然这对每个人都没有帮助,但就我而言,我已经走上了检查我的配置、连接字符串的道路......

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

【讨论】:

1.你在哪里设置起始页? // 2.起始页与EF元数据资源有什么关系? @ArturoTorresSánchez - 右键单击​​解决方案资源管理器中的页面,然后单击“设置为起始页”。我不知道相关性。如果没有选择起始页,我不知道 Visual Studios 在启动时默认是什么。【参考方案14】:

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

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

希望它对你有用..

【讨论】:

太棒了!在 VS 2013 中从 VS 2015 打开项目时有效。【参考方案15】:

我想在这方面分享我的经验以及我是如何解决的。就我而言,这是因为我在生产服务器复制并粘贴我的连接字符串。我的应用程序使用实体框架

元数据有问题

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

所以我的错误 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" />

【讨论】:

【参考方案16】:

在从源代码管理中提取代码后,在开发机器之间移动时,我曾多次遇到此问题。我通常只需要显式地重建包含 EDMX 文件的项目。

【讨论】:

【参考方案17】:

如果您尝试使用多个 EDMX 文件,并且由于冲突而必须将新的 EDMX 文件放在它自己的命名空间中,则在创建 EDMX 文件时请记下向导显示的元数据。那个是正确的。

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

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

虽然 EDMX1 的元数据是“edmx1.csdl|edmx1.ssdl|edmx1.msl” EDMX2 的元数据是“Namespace.edmx2.csdl ...”

【讨论】:

以上是关于实体框架 - 无法加载指定的元数据资源的主要内容,如果未能解决你的问题,请参考以下文章

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

无法加载指定的元数据资源(转载)

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

无法加载 DLL 'sni.dll' - 实体框架核心

无法使用实体框架找到或加载 Npgsql

为啥实体框架 6.1.3 抛出“无法加载类型‘System.Data.Entity.Infrastructure.TableExistenceChecker’”