Entity Framework - Unable to load the specified metadata resource
我意识到这已经被问过很多次了,但我似乎无法弄清我的问题到底是什么。我得到以下错误堆栈:
当我反映出我的动态链接库时,我可以看到以下内容
阅读http://blogs.teamb.com/craigstuntz/2010/08/13/38628/它建议我希望在这里看到csdl、msl和ssdl文件,但它们不是。它们确实存在于objdebugedmxresourcestoembed中。
我尽量通过这样做来明确地告诉web.config在哪里查找:
1 | ...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"。
与此非常相似,所以问题无法解析assembly model.dll
最后我尝试将元数据行更改为:
1 | ...connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider ... /> |
这就抛出了一条关于我不使用的SQL CE的消息——有没有解决这个问题的方法??
还有什么我可以尝试的吗?或者有人能看到我哪里出错了吗?一些额外的细节:
使用ef 6 edmx设置为"嵌入资源"
复制到输出目录:"不复制"
- 元数据工件处理:"嵌入到输出中汇编
最后,如果我将EDMX从Embedded Resource设置为EntityDeploy,那么这将在本地工作,但不会在生成服务器上生成,因为它会引发与此完全相同的错误,因此问题:
找不到要作为输入文件的资源嵌入的概念架构节点
但修复似乎没有帮助,很遗憾,我无法在服务器上安装.NET 4.5。
我也有同样的问题。在将带有ef模型的.edmx文件移动到单独的程序集之后,上述错误引起了我的头痛:"无法加载指定的元数据资源"。
EF版本6.1
解决方案:
旧价值:
1 | metadata=res://*/Data.DataModel.csdl |
新价值:
1 | metadata=res://*/DataModel.csdl |
最初,edmx在项目的文件夹下,我已经将它移到了项目的根目录中。
所以,我得说清楚,部分原因是我的错。我会把我在下面遇到的每个问题的解决方案,以防它帮助任何其他人。
无法加载指定的元数据资源问题
这是由我将EDMX模型上的"元数据工件处理"设置从"EntityDeploy"设置为"Embedded Resource"引起的。
这意味着它只是将整个EDMX文件嵌入到DLL中,而不是生成ssdl、msl和csdl文件。
我想您必须将其设置为EntityDeploy,这样才能正常工作并生成这些文件。很有道理,我们的坏处就在这里。
无法解析程序集"dllname.dll"
Andrew在上面的评论中解决了这个问题,感谢上面的指针。
找不到要作为输入文件的资源嵌入的概念架构节点
整个问题的关键是,我们的构建服务器目前在Windows 2003上,因此无法安装.NET 4.5,我们在本地使用的是在VS2013上.NET 4.0下运行的EF6.1。
然而,出于某种原因,我们似乎需要在构建服务器上安装.NET 4.5才能构建它,即使我们没有使用任何4.5功能并以.NET 4框架为目标。
把EF降到4.3在短期内解决了这个问题。不太理想,但效果不错。
您应该指定程序集的完全限定名和模型文件的路径(由
1 | connectionString="metadata=res://Name.Of.The.Assembly, Culture=neutral, PublicKeyToken=8e2e51fcf4cf363e/Payment.PaymentModel.csdl|.........." |
同适用于
更改元数据
1 | connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl; |
到
1 | connectionString="metadata=res://*/; |
以上更改将解决此问题
解决方案:1)从Visual Studio打开.edmx文件。2)点击任意位置。3)应参见EDMX属性窗口。4)将命名空间更改为正确的文件夹名称。5)1:https://i.stack.imgur.com/6szvo.png(详细信息请选择图片)。
我也有同样的问题
System.Data.MetadataException: Unable to load the specified metadata resource
结果显示,之前生成的连接字符串上有所有edmx的名称。我从连接字符串中取出了所有模型名称,只在元数据中留下下面的字符串
1 | "metadata=res://*/;provider=System.Data.SqlClient;provider |
这对我很有用。
如果您使用的是
对于使用新的
实际上,我收到了同样的错误,因为我的
如果您在SQL Server中有以下实例:
- MyDabase1
- MyDabase2
确保连接字符串指向与
最简单的方法是使用位于
我也犯了同样的错误。我的连接字符串如下
1 |
我把它改成following,它解决了这个问题。
1 2 | <add name="EmployeeDbContext" connectionString="server=.; database=Sample; integrated security=true;" providerName="System.Data.SqlClient"/> |
此外,在将EDMX文件从Web应用程序移动到数据层(web.config-connection/app.config-connection)时,请注意更改数据层和WebService层中的ConnectionString。(另外一个使用两个不同的连接字符串,这会导致这样的问题)
连接字符串"metadata=res"应与edmx name相同。如
1 | metadata=res://*/EmployeeModel.csdl |
此EDMX名称应为EmployeeModel
我碰到这个问题,它咬了我很多次,很多次,很多次,我总是忘记如何解决它。
我所要做的就是将default.aspx设置为起始页。
显然,这对每个人都没有帮助,但在我的例子中,我已经在检查我的配置、连接字符串……
希望这能帮助别人,或者至少下次我用谷歌搜索它时,我会找到我的解决方法。:)
我在我的Visual Studio 2013中使用了EF6。我通过以下步骤解决了这个问题。
- 右键单击实体模型
- 用XML(文本)编辑器打开
- 在标签集中
ProviderManifestToken="2008" 中 - 构建解决方案
希望它对你有用……
在从源代码管理中提取代码后,在开发机器之间移动时,我已经多次遇到这种情况。我通常只需要用其中的EDMX文件显式地重新构建项目。
我想分享我在这方面的经验以及我如何解决它。在我的例子中,发生这种情况是因为我复制并粘贴了生产服务器上的连接字符串。我的应用程序正在使用实体框架。
Problem was on metadata
我将我的实体模型命名为"Betmodel",但在连接字符串中,我使用的是"entity"-"res:///entity.csdl res:///entity.ssdl res:///entity.msl"on"metadata"(原因是我复制粘贴了它)。
所以我的错误连接字符串是:
1 | connectionString="metadata=res://*/Entity.csdl|res://*/Entity.ssdl|res://*/Entity.msl;provider=System.Data.SqlClient;provider connection string="data source=;initial catalog=;persist security info=True;user id=;password=;MultipleActiveResultSets=True;App=EntityFramework"" |
正确的连接字符串是:
1 |
我正在与另一个开发人员共享我的代码,他遇到了这个问题。没有连接字符串差异。所有文件都正常…我通过设置修复了它
- 元数据工件处理从:"嵌入输出程序集"到"复制到输出目录",
- 重建项目,
- 然后再把它放回去。
我认为这是可行的,因为当使用"复制到输出目录"时,在输出目录中创建了单个文件(csdl/msl/ssdl文件)。显然有一个bug需要嵌入版本才能工作。希望这有帮助:)