MetadataException:无法加载指定的元数据资源
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MetadataException:无法加载指定的元数据资源相关的知识,希望对你有一定的参考价值。
突然间,我一直在获取MetadataException
实例化我生成的ObjectContext
课程。 App.Config中的连接字符串看起来是正确的 - 自上次工作以来没有改变 - 我尝试从底层数据库重新生成一个新模型(edmx文件)而没有任何变化。
有人有主意吗?
更多细节:我没有更改任何属性,我没有更改任何输出程序集的名称,我没有尝试在程序集中嵌入EDMX。我离开工作只等了10个小时,直到我回来。然后它不再工作了。
我试过重新创建EDMX。我试过重新创建这个项目。我甚至尝试从头开始重新创建数据库。没有运气,无论如何。
这意味着应用程序无法加载EDMX。有几件事可以导致这种情况。
- 您可能已将模型的MetadataArtifactProcessing属性更改为“复制到输出目录”。
- 连接字符串可能是错误的。我知道你说你没有改变它,但是如果你改变了其他东西(比如装配的名称),它仍然可能是错的。
- 您可能正在使用后编译任务将EDMX嵌入到程序集中,该程序集由于某种原因不再起作用。
简而言之,你的问题中没有足够的细节来给出准确的答案,但希望这些想法能让你走上正轨。
更新:我写过a blog post with more complete steps for troubleshooting。
对于我的情况,它通过更改edmx文件的属性来解决。
- 打开edmx文件
- 右键单击EDMX设计器的任何位置
- 选择属性
- 更新称为“元数据工件处理”的属性为“嵌入输出程序集”
这解决了我的问题。问题是,当容器试图找到元数据时,它无法找到它。所以只需在同一个组件中进行。如果您将edmx文件放在另一个程序集中,则此解决方案将无法运行
我花了一整天时间来解决这个错误
如果你正在使用n-tear architecture
或者你试图通过separate Models
生成的EDMX
形式DataAccessLayer到DomainModelLayer
也许你会得到这个错误
- 第一个故障排除步骤是确保
webconfig (UILayer)
and和appconfig (DataAccessLayer)
中的连接字符串相同 - 第二个是非常重要的
connection string
connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provid.....
这是问题所在
从地球上我得到Model
or什么.csdl在我的连接字符串中他们在哪里
在这里,我的解决方案看看图片
希望对你有所帮助
当我在构建新的.edmx设计器之前不清理解决方案时,这种情况发生在我身上。因此,在构建新的.edmx设计器之前,不要忘记清理解决方案。这有助于我跳过更多这个问题。提供导航详细信息,这是视觉工作室的新功能。
单击 - >构建 - >清洁解决方案
然后单击 - >构建 - >重建解决方案
希望这可以帮助。感谢大家
我能够在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"
最终解决方案(即使在其他两台机器上重建数据库,以及EDMX和其他杂物)也不使用第一版的Entity Framework。期待在.NET 4.0中再次评估它。
在再次遇到同样的问题并搜索到所有问题之后,我终于找到了一个有同样问题的人。 Visual Studio的向导似乎没有正确生成连接字符串,并且元数据资源的链接缺少重要路径。
v1.0 BUG?: Unable to load the specified metadata resource. Scripts != Models
更新2013-01-16:已经过渡到几乎完全使用EF Code First实践(即使使用现有数据库),这个问题不再是问题。对我来说,这是一个可行的解决方案,可以减少自动生成的代码和配置的混乱,并增加我自己对产品的控制。
我的问题和解决方案,症状是相同的“无法加载指定的元数据资源”,但根本原因是不同的。我在解决方案中有2个项目,一个是EntityModel,另一个是解决方案。我实际上删除并重新创建了EntityModel中的EDMX文件。
解决方案是我必须返回Web应用程序项目并将此行添加到配置文件中。新模型改变了一些必须在“其他”项目的Web.Config文件中复制的项目。旧的配置不再好。
<add name="MyEntities"
connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=QDEV15;initial catalog=whatever;
user id=myuserid;password=mypassword;
multipleactiveresultsets=True;
application name=EntityFramework""
providerName="System.Data.EntityClient" />
经过数小时的谷歌搜索,并试图解决所有建议的解决方案。我在这里列出了几个解决方案。我也注意到了一个适合我的方法。 (我使用的是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版本还原到更高版本(不确定)]
什么对我有用:
从这个article here,它帮助我解决了我的问题。我刚刚在EDMX文件中将ProviderManifestToken="2012"
更改为ProviderManifestToken="2008"
。去做这个:
Solution Explorer
- 右键单击文件.edmx
- 打开用..
- CML编辑器
- 使用2008更改ProviderManifestToken =“XXXX”
我希望有所帮助。
在我的例子中,这个问题与重命名我的模型的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 Walk-through并将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
玩得开心。
这个小改动有助于解决这个问题。
我有3个项目的解决方案。
connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;
改成
connectionString="metadata=res://*/;
我遇到了同样的错误信息。关闭并重新打开Visual Studio 2010解决了我的问题。
有同样的问题,因为我重命名了一个程序集。
我还必须在项目Properties / AssemblyInfo.cs中的AssemblyTitle和AssemblyProduct属性中重命名它,还删除并重新添加对edmx文件的引用。
然后它工作得很好。
遇到同样的问题,我从数据库重新创建了edmx。解决了我的问题。
例外是因为编译器指向不存在的元数据,所以只需将app.config
连接字符串复制到Web.config
ConnectionString
如果您使用来自其他项目的edmx,则在连接字符串中,更改...
metadata=res://*/Data.DataModel.csdl
...至...
metadata=res://*/DataModel.csdl
我也有与Rick相同的问题和解决方案,除了我将现有的.edmx导入到一个新项目中,虽然基本命名空间无关紧要,但它被导入到一个不同的子目录中,所以我还必须更新连接Web.Config里面的三个字符串,包括不同的子目录命名:
当我们将解决方
以上是关于MetadataException:无法加载指定的元数据资源的主要内容,如果未能解决你的问题,请参考以下文章
由于错误 0xC001000A,无法加载包。说明:无法从 SQL Server 数据库加载指定的包