当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《MetadataException:无法加载指定的元数据资源》经验,为你挑选了14个好方法。

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

有人有主意吗?

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

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



1> Craig Stuntz..:

这意味着应用程序无法加载EDMX.有几件事可以导致这种情况.

您可能已将模型的MetadataArtifactProcessing属性更改为"复制到输出目录".

连接字符串可能是错误的.我知道你说你没有改变它,但是如果你改变了其他东西(比如装配的名称),它仍然可能是错的.

您可能正在使用后编译任务将EDMX嵌入到程序集中,该程序集由于某种原因不再起作用.

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

更新:我写了一篇博文,其中包含更完整的故障排除步骤.


尽管我上次努力将它与内容比较实用程序进行比较,但却是*错误的连接字符串.
这也是我的关系.当您的集成测试也需要在其自己的App.config中进行连接时,更新edmx时可能会失去同步.
好的,我通过简单地设置"嵌入"来修复它; 编译,然后将其重置到另一个.这解决了我的问题.
很棒的指南.对我来说,我复制了另一个使用res://*/Database.MyModel2 ...的连接字符串,当我真的想要res://*/MyModel1 ...(数据库是我的Integration Tests项目中的一个文件夹)
有同样的问题,尝试了你的解决方案,想给+1,意识到我已经在过去做过了.我甚至不记得以前遇到过这个问题;).在我的情况下,这次是使用edmx时类库中的正确连接字符串,以及使用时在Web应用程序中的错误.
答案中引用的博文有助于解决我的问题.
如果它是连接字符串,并且您正在执行"数据库优先",则可以通过比较edmx设计器中"从数据库更新"时获得的内容与web.config中的内容进行比较,从而轻松地(在大多数情况下).或app.config.
神奇!我将conntection字符串更改为metadata = res://*/; provi ..并且它有效!!
在我的情况下,我已将edmx移动到另一个文件夹并正确更改了web.config中的res路径,但我没有在web.debug.config和web.release.config转换中更改它们

2> MicTech..:

这个小改动有助于解决这个问题.

我有3个项目的解决方案.

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

改成

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


@Lance:我在[此博客文章]中详细解释了这一点(http://blogs.teamb.com/craigstuntz/2010/08/13/38628/)
它为我修好了,但它到底是什么意思?
你先生已经从一个非常生气的消费者中拯救了一位可怜的微软员工.
将我的.edmx移动到Model文件夹,忘记更新连接字符串.伟大的指针.谢谢.我需要花费数小时才能搞清楚.
@jocull:不,它在许多情况下都不会起作用,而在其他情况下会很慢.阅读我的博客文章,了解原因.
我已经完成了,并且id解决了一个问题但是给了我另一个`所有加载到ItemCollection中的工件必须具有相同的版本.遇到了多个版本. - 最后是Npgsql.只有完整的道路解决了两者

3> 小智..:

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

原因是Res://*/uri指向CURRENT程序集中的资源.如果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文件的文件名.当资源具有与元数据值中指定的名称不同的名称时,它将不起作用.


如果在程序集中使用名称空间,请考虑"YourEdmxFileName"必须是限定名称,例如"YourNamespace.YourEdmxFileName".但是,您必须删除名称空间中与程序集名称相等的部分.
[MSDN说第二段是错误的.](http://msdn.microsoft.com/en-us/library/cc716756.aspx)"当你使用通配符(*)时,实体框架必须查看所有程序集对于名称正确的资源."

4> Rick Arthur..:

我有类似的错误.我重新创建了这个项目(长篇故事),并从旧项目中删除了所有内容.我之前没有意识到我的模型已经在名为"模型"的目录中,现在位于名为"模型"的目录中.一旦我在Web.Config中更改了连接:


Web.config文件:


修复它只是复制app.config字符串(注意最后的小差异 - 而不是" App=EntityFramework"它想要" application name=EntityFramework")进入web.config并解决了问题.:)



7> hgcummings..:

当我意外地将edmx文件的构建操作(在IDE中的属性下显示)从"EntityDeploy"切换为"无"时,这发生在我身上.EntityDeploy是为您填充元数据的内容:请参阅http://msdn.microsoft.com/en-us/library/cc982037.aspx



8> TobyEvans..:

我刚刚度过了30分钟.我重命名了实体对象,重命名了配置文件中的条目,但还有更多......你还要更改对csdl的引用

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



9> Liakat..:

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

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

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

希望这可以帮助。感谢大家



10> Pitming..:

我有同样的问题.我用反射器查看了我的编译后的dll,并看到资源的名称不正确.我改名了,现在看起来很好.



11> 小智..:

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

    打开edmx文件

    右键单击EDMX设计器的任何位置

    选择属性

    更新称为"元数据工件处理"的属性为"嵌入输出程序集"

这解决了我的问题.问题是,当容器试图找到元数据时,它无法找到它.所以只需在同一个组件中进行.如果您将edmx文件放在另一个程序集中,则此解决方案将无法运行



12> Basheer AL-M..:

我花了一整天时间来解决这个错误

如果你正在使用 n-tear architecture

或者您尝试separate Models通过EDMX表单DataAccessLayer 生成DomainModelLayer

也许你会得到这个错误

    第一个故障排除步骤是确保连接字符串在webconfig (UILayer)appconfig (DataAccessLayer)中是相同的

    其次是非常重要的 connection string

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

    这是问题所在

从我Model到底在哪里或者我的连接字符串中的任何.csdl它们在哪里

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

在此输入图像描述

希望对你有所帮助



13> Internet Eng..:

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

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

我唯一缺少的是"App_Code".在连接字符串中.

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



14> ben..:

经过数小时的谷歌搜索和尝试解决,建议的解决方案均无用。我在这里列出了几种解决方案。我也注意到了对我有用的那个。(我使用的是EF版本6.1.1和SQL Server 2014-但使用的是较旧的数据库)

    重建项目,然后重试。

    关闭和打开VS-我不知道它是如何工作的

    确保已将.EDMX文件放置在目录中,请确保将目录包括在ConnectionString中。例如我的在DAL文件夹中。所以看起来像这样:(connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl;这些是文件。要查看它们,您可以在解决方案资源管理器中的〜/ obj / ..目录下切换“显示所有文件”)

...以及我尝试过的许多其他操作[例如:将EntityFramework版本还原为更高版本(不确定)


对我有用的是:

从这里的这篇文章,它帮助我解决了我的问题。我只是改变了我ProviderManifestToken="2012"ProviderManifestToken="2008"在EDMX文件。去做这个:

解决方案资源管理器

    右键单击文件.edmx

    打开用..

    编辑器XML

    将ProviderManifestToken =“ XXXX”更改为2008

希望对您有所帮助。

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有