系统数据元数据异常:无法加载指定的元数据资源。

34

我的连接字符串如下:

<add name="RollCallDBEntities" connectionString="metadata=res://System.Engine/RollcallNS.csdl|res://System.Engine/RollcallNS.ssdl|res://System.Engine/RollcallNS.msl;provider=Devart.Data.Oracle;provider connection string=&quot;User Id=user;Password=password;Server=127.0.0.1;Direct=True;Sid=ORCL&quot;" providerName="System.Data.EntityClient" />

我的代码如下:

using (var db= new RollCallDBEntities()) //ok
{
   var query = db.TBL_ROLLCALL.ToList(); //Unable to load the specified metadata resource.
}

我的汇编:

System.Engine

有人有什么想法吗?

这些链接没有解决我的问题:
MetadataException: 无法加载指定的元数据资源
实体框架:无法加载指定的元数据资源
实体框架:无法加载指定的元数据资源
无法加载指定的元数据资源


你确定资源已经嵌入程序集了吗?使用ildasm或者reflector来双重确认它们是否存在。 - Pawel
你可以尝试的另一件事是在所有三个位置将'System.Engine'替换为'*'。 - Pawel
@Pawel TBL_ROLLCALL 的代码如下:`namespace System.Engine { using System; using System.ComponentModel; using System.Data.Objects.DataClasses; using System.Runtime.Serialization; using System.Xml.Serialization;[Serializable, EdmEntityType(NamespaceName="RollCallNS", Name="TBL_ROLLCALL"), DataContract(IsReference=true)] public class TBL_ROLLCALL : EntityObject {...}` - Meysam Savameri
这并没有回答我的问题,我在询问嵌入在程序集中的资源,而不是类本身,因为异常表明问题出在资源上。 - Pawel
@xanatos 我恢复了这个问题。 - Meysam Savameri
15个回答

80

我遇到了这样的异常。问题是我重命名了我的.edmx文件,但忘记在EF Web.config文件的连接字符串中更改名称:

metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;

2
如果您有一个不同的项目来访问您的数据,请记得您也应该有两个不同的连接字符串...感谢这个提示。 - David Graça
1
谢谢...有人复制粘贴连接字符串到另一个指向相同数据库的上下文中。因此,EDMX是错误的! - bunjeeb
1
在我的情况下,我将.edmx文件移动到另一个位置并忘记更改连接字符串以指向.edmx文件的新位置。 - freedeveloper
不要忘记在元数据部分中指定数据库实体的命名空间。 - user3873265
@user3873265,我该怎么做?你能提供一个示例吗? - Nitin Sawant
@NitinSawant connectionString="metadata=res:///+++.ModelName.csdl|res:///+++.ModelName.ssdl|...",其中+++是实体模型的命名空间名称。很多人经常忘记添加或更改它。 - user3873265

11

我采用的最简单解决方法是删除与bin文件夹处于同一级别的obj文件夹,然后重新运行应用程序,这真是比必要的时间长得多。


哪个 obj 文件夹?一个在 presentation 内部,另一个在 DAL 内部。 - Zeeshan Ahmad Khalil
@ZeeshanAhmadKhalil 是项目中抛出错误的那个人。 - AltF4_
2
谢谢,我已经通过将连接字符串从App.config复制到Web.config中来解决了它。 - Zeeshan Ahmad Khalil
1
我通过将 App.config 中的连接字符串复制到 Web.config 中,与 Zeeshean 一样解决了问题。 - ransems
在我的 Web 应用程序中也遇到了同样的问题,这很有帮助,谢谢。 - user2217057
运行一个旧的 .net 4.5 框架项目,这为我节省了很多时间! - BrianInPhx

8
请参考http://forums.devart.com/viewtopic.php?t=22092
如果这不能帮助您,请指定以下内容:
  • 您是否使用ADO.NET Entity Data Model (.edmx)或Devart Entity Model (.edml)?
  • 您的模型文件的Build Action属性的值是多少?
  • 您的模型的元数据处理属性的价值是什么?
  • 您的dotConnect for Oracle版本号(x.xx.xxx)是多少?
  • 您的Visual Studio版本是多少?
  • 按照Pawel的建议,检查资源是否嵌入程序集中。

3

右键单击项目>>清除>>然后重建

对我起作用了


我也试过了,谢谢! - Flemming Bonde Kentved

2
在一个解决方案中,我使用了EntityFramework 6.0,其中包括多个项目,如WebSite级别项目、DataAccess级别项目。在我的解决方案中,迁移应该在DataAccess级别项目中进行。
当我在包管理器控制台中运行Add-Migration命令时,引发了“无法加载指定的元数据资源”的错误。
最后,我发现我将WebSite级别项目设置为“启动”项目,这触发了上述异常。似乎系统会自动首先检查StartUp项目中的连接字符串设置。而我在WebSite级别项目中设置的数据连接字符串是:
"metadata=res:///ApplicationEntities.csdl|res:///ApplicationEntities.ssdl|res://*/ApplicationEntities.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=YourDatabaseName;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework""
这对于Code First不正确。
正确的连接字符串应该是:
"Data Source=.;Initial Catalog=YourDatabaseName;Integrated Security=True"
结论:总是首先检查解决方案中“启动”项目中的web.config中的“connectionStrings”部分。

谢谢。将EF项目中的连接字符串复制到入口点项目的配置文件中解决了问题。 - Bassem Akl

2
我也遇到了这个问题,原因是我从Entity Framework Model First转换到Entity Framework Code First时,忘记将EDMX连接字符串更改为“常规”连接字符串。最初的回答。

1

我在使用Devart DotConnect for Oracle 8.5时遇到了错误。我只需要:

  1. 将扩展名edml重命名为edmx;
  2. 将文件的关联DevartEntityDeploy属性更改为EntityDeploy,错误就消失了。

如果你使用JustDecompile/DotPeek/DnSpy分析数据访问Dll中的资源文件夹,可以轻松发现这个错误:

DotPeek dll listing

如果资源文件夹为空或丢失,您将会遇到此错误。

1

这个答案是针对Devart Entity Developer edml文件的。

当我升级csproj格式(使用简单格式的Visual Studio 2017)时,我遇到了这个错误。csproj有一个功能,你不需要每个文件都包含进来,而是默认情况下将所有相关文件包括在文件夹下,所以实体框架文件与cs文件被视为相同的方式处理,因此这些文件默认情况下不会嵌入到程序集中。

我需要手动将我的edml文件的构建操作更改为“DevartEntityDeploy”,这解决了我的问题。

enter image description here


1
我们从.net core 1升级到了3.1,从visual studio 2015升级到了visual studio 2019。我们发现一些文件的“Build Action”已被重置。因此,我们将以.tt结尾的所有文件的“Build Action”从“None”更改为“Content”,并将它们的“Copy to Output directory”更改为“Do Not Copy”。
我们还不得不将.edmx文件的构建操作更改为“EntityDeploy”,并将其“copy to output directory”值更改为“Do Not Copy”。
希望对某人有帮助。

0

我也遇到了这个问题,因为我在app.config中缺少了entityFramework配置部分。

我的代码是这样的:

<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />

但不包括这个:
<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb"/>
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
    </providers>
</entityFramework>

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