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

突然间,我在实例化我生成的ObjectContext类时总是得到一个MetadataException。App. Config中的连接字符串看起来是正确的-自上次工作以来没有改变-我尝试从底层数据库重新生成一个新模型(edmx文件),没有改变。

有人有什么想法吗?

更多细节:我没有更改任何属性,我没有更改任何输出程序集的名称,我没有尝试在程序集中嵌入EDMX。我从下班到回来只等了10个小时。然后它就不再工作了。

我尝试过重新创建EDMX。我尝试过重新创建项目。我甚至尝试从头开始重新创建数据库。没有运气,无论如何。

529995 次浏览

这意味着应用程序无法加载EDMX。有几个原因会导致这种情况。

  • 您可能已将模型的MetadataArtifactProcess属性更改为复制到输出目录。
  • 连接字符串可能是错误的。我知道您说您没有更改它,但如果您更改了其他内容(例如,程序集的名称),它仍然可能是错误的。
  • 您可能正在使用编译后任务将EDMX嵌入到程序集中,但由于某种原因不再工作。

简而言之,你的问题中没有足够的细节来给出准确的答案,但希望这些想法能让你走上正确的轨道。

更新时间:我写了包含更完整的故障排除步骤的博客文章

最终的解决方案(即使在另外两台机器以及EDMX和其他杂物上重新创建数据库之后)是不使用Entity Framework的第一版。期待在. NET 4.0中再次评估它。

在遇到同样的问题再次并到处寻找答案之后,我终于找到了遇到同样问题的人。看来Visual Studio的向导没有正确生成连接字符串,并且指向元数据资源的链接缺少一个重要路径。

v1.0 BUG?:无法加载指定的元数据资源

更新时间2013-01-16:已经过渡到几乎完全使用EF Code First实践(即使使用现有数据库),这个问题不再是问题。对我来说,这是一个可行的解决方案,可以减少自动生成代码和配置的混乱,并增加我自己对产品的控制。

一个小小的修改帮助我解决了这个问题。

我有一个解决方案,有3个项目参考:

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

我将其更改为:

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

我也遇到了同样的问题。我查看了我用反射器编写的dll,发现资源的名称不正确。我重命名了,现在看起来不错。

我也遇到了类似的错误。我重新创建了项目(说来话长),并从旧项目中提取了所有内容。我没有意识到我的模型以前在一个名为“Model”的目录中,现在在一个名为“Models”的目录中。一旦我更改了Web中的连接。

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl

对此:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl

一切正常(将Model更改为Models)。请注意,我必须更改此字符串中的这三个位置。

当我不小心将edmx文件的构建操作(出现在IDE的属性下)从“EntityDeploy”切换到“无”时,就发生了这种情况。

我刚刚花了一个快乐的30分钟。我重命名了实体对象,重命名了配置文件中的条目,但还有更多……你还必须更改对csdl的引用

很容易错过-如果你正在重命名,请确保你得到一切……

我也遇到了与Rick相同的问题和解决方案,除了我正在将现有的. edmx导入到新项目中,虽然基本命名空间无关紧要,但它被导入到不同的子目录中,所以我还必须在三个地方更新Web. Config中的连接字符串,以包括不同的子目录命名:

我的理论是,如果您有多个同名的edmx文件(例如Model1),它会给出异常。 当我决定将所有edmx文件(位于不同的项目中)命名为Model1时,我遇到了同样的问题,因为我认为它们应该是独立的。

当Edmx在一个项目中并且您正在从另一个项目中使用它时,您可以获得此异常。

原因是Res://*/是指向CURRENT程序集中资源的uri。如果Edm在与使用它的代码不同的程序集中定义,res://*/将不起作用,因为找不到资源。

您需要提供程序集的全名(包括公钥令牌),而不是指定“*”。例如:

res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...

构造连接字符串的更好方法是使用EntityConnectionStringBuilder:

public static string GetSqlCeConnectionString(string fileName)
{
var csBuilder = new EntityConnectionStringBuilder();


csBuilder.Provider = "System.Data.SqlServerCe.3.5";
csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName);


csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
typeof(YourObjectContextType).Assembly.FullName);


return csBuilder.ToString();
}


public static string GetSqlConnectionString(string serverName, string databaseName)
{
SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder();


providerCs.DataSource = serverName;
providerCs.InitialCatalog = databaseName;
providerCs.IntegratedSecurity = true;


var csBuilder = new EntityConnectionStringBuilder();


csBuilder.Provider = "System.Data.SqlClient";
csBuilder.ProviderConnectionString = providerCs.ToString();


csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
typeof(YourObjectContextType).Assembly.FullName);


return csBuilder.ToString();
}

如果您仍然遇到异常,请在反射器中打开程序集并检查. csdl、. ssdl和. msl文件的文件名。当资源的名称与元数据值中指定的名称不同时,它将不起作用。

在我的例子中,这个问题与重命名我的模型的edmx文件有关……纠正csdl/ssdl/msl文件的app.config连接字符串修复了我的问题。

如果您使用EF 4.0设计器生成csdl/ssdl/msl,这3个“文件”实际上将存储在模型的主edmx文件中。在这种情况下,Waqas的帖子非常正确。重要的是要理解他的示例中的“Model_Name”需要更改为模型的. edmx文件的当前名称(没有. edmx)。

此外,如果edmx文件不在项目的根级别,则需要在Model_Name前面加上相对路径,例如。

res://*/MyModel.WidgetModel.csdl|res://*/MyModel.WidgetModel.ssdl|res://*/MyModel.WidgetModel.msl

将指定csdl/ssdl/msl xml存储在模型文件“WidgetModel.edmx”中,该文件存储在名为“MyModel”的文件夹中。

我编写了这个帮助程序类来创建ObjectContext对象的实例,当它们在与使用它的项目不同的项目中定义时。我解析配置文件中的连接字符串并将“*”替换为完整的程序集名称。

它并不完美,因为它使用反射来构建对象,但这是我能找到的最通用的方法。

希望它能帮助某人。

public static class EntityHelper<T> where T : ObjectContext
{
public static T CreateInstance()
{
// get the connection string from config file
string connectionString = ConfigurationManager.ConnectionStrings[typeof(T).Name].ConnectionString;


// parse the connection string
var csBuilder = new EntityConnectionStringBuilder(connectionString);


// replace * by the full name of the containing assembly
csBuilder.Metadata = csBuilder.Metadata.Replace(
"res://*/",
string.Format("res://{0}/", typeof(T).Assembly.FullName));


// return the object
return Activator.CreateInstance(typeof(T), csBuilder.ToString()) as T;
}
}

对于所有SelftrackingEntities用户, 如果您已经遵循Microsoft演练并将Object上下文类分离为 wcf服务项目(通过链接到上下文. tt),所以这个答案是给你的:

这篇文章中显示的部分答案包括以下代码:

... = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
typeof(YourObjectContextType).Assembly.FullName);

不会为你工作!!原因是YourObjectContextType.Assembly现在驻留在不同的Assembley中(在wcf项目程序集中),

所以你应该用-->替换YourObjectContextType.Assembly.FullName

ClassTypeThatResidesInEdmProject.Assembly.FullName

玩得开心。

我能够在Visual Studio 2010VB.net(ASP.NET)4.0中解决这个问题。

在实体模型向导期间,您将能够看到实体连接字符串。您可以从那里复制并粘贴到您的连接字符串中。

我唯一缺少的是连接字符串中的“App_Code”。

entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"

此异常的另一个原因是您在ObjectQuery中包含相关表,但键入错误的导航属性名称。

示例:

var query = (from x in myDbObjectContext.Table1.Include("FKTableSpelledWrong") select x);

对于我的情况,它是通过更改edmx文件的属性来解决的。

  1. 打开edmx文件
  2. 右键单击EDMX设计器的任何位置
  3. 选择属性
  4. 将名为“元数据工件处理”的属性更新为“嵌入输出程序集”

这解决了我的问题。 问题是,当容器尝试查找元数据时,它找不到它。所以只需在同一个程序集中制作它。 如果您的edmx文件在另一个程序集中,此解决方案将不起作用

我遇到了同样的错误消息问题。我的问题已通过关闭并重新打开Visual Studio 2010得到解决。

有时不加载包含模型的程序集:

    [TestMethod]
public void TestOpenWithConfigurationAfterExplicit()
{
String dummy = typeof(MallApp).Assembly.FullName;
//force the assembly loaded.
using (DbContext ctx = new DbContext("name=MyContainer))
{
}
}

类型MallApp与实体模型位于同一程序集中。如果没有显式加载,将抛出System.Data.MetadataException

我在解决方案文件夹中包含项目的解决方案中遇到了同样的问题,当它们被移动到解决方案根时(为了克服由于项目位置而导致的Mvc3AppConver的可疑bug)。

尽管根据需要重新添加了所有*项目引用后编译的解决方案,但在网站启动时抛出了错误。

EDMX位于被移动的项目之一(“Data”项目)中,但当然,缺少对Data项目的引用并不会导致编译错误,只是运行时错误。

只需将缺少的引用添加到主项目即可解决此问题,根本无需编辑连接。

我希望这能帮助别人。

有同样的问题,因为我重命名了一个程序集。

我还必须在项目Properties/AssemblyInfo.cs中的Assemblytitle和AssemblyProducts属性中重命名它,并删除并重新添加对edmx文件的引用。

然后它工作得很好。

至于我,我已经分离了数据访问层和用户界面层。 所以我有每个层的实体连接字符串。

在我将这两个分离的连接字符串修改为相同之前,我仍然发现下面的错误。

Unable to load the specified metadata resource

所以我使这两层(DAL,UI)的连接字符串相同,它工作完美。

我的解决方案是使所有的连接字符串是相同的无论他们已经提出

我也遇到了这个问题,这是因为我web.config中的连接字符串与EDMX所在的程序集app.config中的连接字符串略有不同。不知道为什么它改变了,但这里有两个不同的版本。

App.config:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SMCSModel.csdl|res://*/Model.SMCSModel.ssdl|res://*/Model.SMCSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Web.config:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SCMSModel.csdl|res://*/Model.SCMSModel.ssdl|res://*/Model.SCMSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

修复它的方法是简单地将app.config字符串复制到web.config中(注意最后的小差异-而不是“App=EntityFramework”它想要“application name=EntityFramework”),问题就解决了。

当我把元数据问题解决后,我遇到了一个后续问题,即调用异常无法在app.config中找到XXXEntities的连接字符串(我的目标是不依赖于app.config)。纯粹幸运的是,我发现在我的单元测试项目中引用System. Data清除了这个最后的障碍。所以总结一下:

  1. 使用nuget将Entity Framework安装到单元测试项目中。
  2. 确保引用System. Data. Entity和System. Data。
  3. 按照此处的描述对连接字符串进行排序。
  4. 将连接字符串传递给您的部分类构造函数。

我现在有一个类库中的元数据,它可以从参考数据库更新,我可以在运行时将我的应用程序和单元测试指向任何服务器上的任何数据库。

附录:当我将edmx移动到一个文件夹时,我再次遇到错误。经过一些研究,我发现您希望元数据字符串看起来像:元数据=res://EPM.DAL/Models.EPM.csdl,其中EPM.DAL是程序集的名称,EPM.edmx在模型文件夹中。

遇到同样的问题,我从数据库中重新创建了edmx。 解决我的问题

和一个快速的方法来检查没有反射器的型号名称……寻找目录

… obj/{config输出}/edmxResourcesToEmbed//获取资源的时间戳

并检查. csdl、. msl和. ssdl资源文件是否存在。如果它们位于子目录中,则必须在模型名称之前添加子目录的名称。

例如,我的三个资源文件位于子目录数据中,因此我的连接字符串必须是

元数据=res://*/# EYZ0.MyModel.csdl|res://*/# EYZ0.MyModel.ssdl|res://*/# EYZ0.MyModel.msl;

(相对于元数据=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;)。

对我来说类似的问题。我的类名与我的文件名不同。生成的连接字符串有类名而不是文件名。对我来说,解决方案就是重命名我的文件以匹配类名。

我昨天遇到了这个问题,正在查看调试中的代码和SQLProfiler的输出。

在我阅读和理解这篇文章之前,我无法理解的是为什么EntityFramework在调用数据库时抛出这个错误。我在SQLProfiler中查看了数百行,试图找出数据库模型的错误。我找不到任何像我期待的调用,老实说,我不确定我在寻找什么。

如果您处于这个位置,请检查连接字符串。我的猜测是,在EntityFramework创建其SQL之前,它将检查模型,在连接字符串的元数据部分中指定的。在我的情况下,它是错误的。EntityFramework甚至没有达到DB。

确保名称正确。一旦我整理好了,我就会看到SQLProfiler中的调用,其中Application ationName是'EntityFramework',SQL调用预期的表。

一个糟糕的app.config或web.config文件可以做到这一点…我已经将app.config连接字符串复制到我的web.config在我的UI中,最后输入:

<connectionStrings>
<connectionStrings>
<add name="name" connectionString="normalDetails"/>
</connectionStrings>
</connectionStrings>

我只是没有引用包含EDMX文件的类库。

使用来自这篇博客的信息:

正如其他人所说,res:\\是指向您的资源的指针。要检查并确保您的资源名称正确,您可以使用JetBrains的DotPeek等反编译器打开您的. dll文件并查看您的资源文件。

或者,您可以在调试和粘贴此代码时打开监视窗口,以获取当前正在执行的程序集中的资源名称数组。

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()

话虽如此,元数据路径的格式应该是这样的:

{我的组件名称}/{可能的名称空间}。{类名称}。{csdl或ssdl或msl}

我的问题和解决方案,症状是相同的“无法加载指定的元数据资源”,但根本原因是不同的。我在解决方案中有两个项目,一个是EntityModel,另一个是解决方案。我实际上删除并在EntityModel中重新创建了EDMX文件。

解决方案是我必须回到Web Application项目并将这一行添加到配置文件中。新模型更改了一些必须在“其他”项目的Web. Config文件中复制的项目。旧的配置不再好。

     <add name="MyEntities"
connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;
provider=System.Data.SqlClient;
provider connection string=&quot;
data source=Q\DEV15;initial catalog=whatever;
user id=myuserid;password=mypassword;
multipleactiveresultsets=True;
application name=EntityFramework&quot;"
providerName="System.Data.EntityClient" />

经过几个小时的谷歌搜索并试图解决建议的解决方案都不起作用。我在这里列出了几个解决方案。我还注意到对我有效的那个。(我使用的是EF版本6.1.1,和SQL服务器2014-但一个较旧的数据库)

  1. 重新构建项目,然后再试一次。
  2. 关闭和打开VS-我不知道这是如何工作的
  3. 确保您已将. EDMX文件放置在目录中,确保您将目录包含在连接字符串中。例如,我的在DAL文件夹中。所以它看起来像这样:connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl;(这些是文件。要查看它们,您可以在解决方案资源管理器中的~/obj/…目录下切换显示所有文件)

…还有更多我尝试过的[比如:将EntityFramework版本恢复到更高版本(不确定)]


什么对我有用:

从这个文章在这里,它帮助我解决了我的问题。我刚刚在EDMX文件中将我的ProviderManifestToken="2012"更改为ProviderManifestToken="2008"。为此:

解决方案资源管理器

  1. 右键单击文件. edmx
  2. 打开…
  3. 编辑器xml
  4. 将ProviderManifestToken="XXXX"更改为2008

我希望这能有所帮助。

当我的emdx文件被预编译命令删除时,我得到了这个错误,很简单。我花了一段时间才意识到这很简单。

只需键入path如下而不是{Path. To. The.}:res:///{Path. To. The.}YourEdmxFileName.csdl|res:///{Path. To. The.}YourEdmxFileName.ssdl|res://*/{Path. To. The.}YourEdmxFileName.msl

异常是因为编译器指向不存在的元数据,所以只需将app.config连接字符串复制到Web.config连接字符串

我花了一整天在这个错误上

如果您正在使用n-tear architecture

或者您尝试将EDMX生成的separate Models从DataAccessLayer转换为DomainModelLayer

也许你会得到这个错误

  1. 第一个故障排除步骤是确保webconfig (UILayer)appconfig (DataAccessLayer)中的连接字符串相同
  2. 第二个非常重要的connection string

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

    这就是问题所在

从地球上我得到Model或任何. csdl在我的连接字符串他们在哪里

在这里我我们的解决方案看图片

在此处输入图片描述

希望对你有帮助

在我的情况下,这是因为我正在使用EntityConnectionStringBuilder构建连接字符串。确保您的元数据属性使用模型名称(包括命名空间)

我在将一个大型解决方案从源代码管理资源管理器中的一个文件夹移动到另一个文件夹后遇到了这个问题。我们没有将包文件夹签入Team Foundation,所以我认为VS会自动下载包。这将我的EF表单v6.1.2升级到v6.1.3。

当我降级到原始v6.1.2时,问题消失了。

如果您正在使用来自不同项目的edmx,则在连接字符串中,更改…

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

…到…

metadata=res://*/DataModel.csdl

在我的情况下,列出的答案都不起作用,所以我发布了这个。

对于我来说,在Visual Studio上构建并使用IIS Express运行它工作得很好。但是当我将Nant脚本作为独立网站部署时出现了错误。我尝试了上面所有的建议,然后意识到nant脚本生成的DLL比VS生成的DLL小得多。然后我意识到Nant无法找到. csdl、. msl和. ssdl文件。所以解决这个问题有两种方法,一种是在Visual Studio生成所需的文件后复制这些文件,并将这些文件包含在构建部署中。然后在Web.config中,指定path为:

"metadata=~/bin/MyDbContext.csdl|~/bin/MyDbContext.ssdl|~/bin/MyDbContext.msl;provider=System.Data.SqlClient;...."

这是假设您已手动将文件复制到您正在运行的网站的bin目录中。如果它在不同的目录中,请相应地修改路径。 第二种方法是在Nant脚本中执行EdmGen.exe并生成文件,然后将它们包含为资源,如下例所示: https://github.com/qwer/budget/blob/master/nant.build

当我在构建新的. edmx设计器之前不清理解决方案时,会发生这种情况。所以在构建新的. edmx设计器之前不要忘记清理解决方案。这有助于我跳过更多的问题。如果你是Visual Studio的新手,请下载提供的导航详细信息。

点击->构建->清洁解决方案

然后点击->构建->重建解决方案

希望这有帮助谢谢大家

有时我在我的项目中看到这个错误。我通过

1-右键单击EDMX文件

2-选择Run Custom Tool选项

3.重建项目

我在2019年9月27日遇到了同样的问题。

我的API在Dot net core中,目标是. net框架。 edmx在一个不同的类库中,它只在. net框架中。

我观察到,当我尝试从API调用edmx时…由于某种原因,我得到了那个错误。

我所做的是,转到API的obj文件夹并删除所有内容。 然后清理API项目并再试一次,这对我有用。

我正在反思一个旧程序,我面临同样的问题。我查阅了之前的答案,我成功地解决了它,将"Model.csdl","Model.ssdl"和"Model.msl"3个文件放在bin目录中,也在实体类旁边。 之后,将web.config中实体连接字符串的metdata部分更改为:

metadata=~/bin/Model.csdl|~/bin/Model.ssdl|~/bin/Model.msl

并且程序运行成功,不显示此异常。

我从解决方案中的所有项目中删除了\bin和\obj文件夹,然后重建了解决方案,效果很好

在我的情况下,EDMX的XML结构中的语法错误也是原因。我认识到在VS之后无法显示图表并打开XML编辑器。

较早的合并是语法错误的根本原因。