使用实体框架实体连接时出现MetadataException

MetadataException when using Entity Framework Entity Connection

本问题已经有最佳答案,请猛点这里访问。

此代码:

1
2
3
4
using (EntityConnection conn = new EntityConnection("name=ELSCommonEntities"))
{
  conn.Open();
}

给出以下错误:

1
Test method ELS.Service.Business.IntegrationTest.Base.ServiceBaseIntegrationTest.StartLoggingTestMethod threw exception:  System.Data.MetadataException: Unable to load the specified metadata resource..

使用以下堆栈跟踪:

1
2
3
4
5
6
7
8
9
System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.LoadResources(String assemblyName, String resourceName, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.CreateResourceLoader(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
System.Data.Metadata.Edm.MetadataArtifactLoader.Create(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
System.Data.EntityClient.EntityConnection.SplitPaths(String paths)
System.Data.EntityClient.EntityConnection.GetMetadataWorkspace(Boolean initializeAllCollections)
System.Data.EntityClient.EntityConnection.InitializeMetadata(DbConnection newConnection, DbConnection originalConnection, Boolean closeOriginalConnectionOnFailure)
System.Data.EntityClient.EntityConnection.Open()
ELS.Service.Business.Base.ServiceBase.StartLogging(String userWindowsLogon) in C:\C-TOM\ELS-RELEASE1\ELS.Service.Business\Base\ServiceBase.cs: line 98
ELS.Service.Business.IntegrationTest.Base.ServiceBaseIntegrationTest.StartLoggingTestMethod() in C:\C-TOM\ELS-RELEASE1\ELS.Service.Business.IntegrationTest\Base\ServiceBaseIntegrationTest.cs: line 65

但是,此代码使用相同的连接字符串:

1
2
3
4
5
6
7
using (ELSCommonEntities db = new ELSCommonEntities())
{
    var res = from c in db.Logging
              select c;

    int i = res.Count();
}

不会出错。

连接字符串为:

1
 

我还打开了Reflector中的dll,元数据看起来还可以。


发现了问题。

标准元数据字符串如下所示:

1
metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl

这在大多数情况下都很有效。但是,在某些(包括我的)实体框架中,会出现混淆,不知道要查找哪个DLL。因此,将元数据字符串更改为:

1
metadata=res://nameOfDll/Model.csdl|res://nameOfDll/Model.ssdl|res://nameOfDll/Model.msl

它会起作用的。正是这个链接让我走上了正轨:

http://itstu.blogspot.com/2008/07/to-load-specified-metadata-resource.html

虽然我有oposite问题,但没有在单元测试中工作,而是在服务中工作。


我有相同的错误消息,问题也是连接字符串的元数据部分,但我必须更深入地研究解决它,并希望共享这个小金块:

元数据字符串由三个部分组成,每个部分如下所示:

1
2
3
res://
      (assembly)/
      (model name).(ext)

其中ext是"csdl"、"ssdl"和"msl"。

对于大多数人来说,程序集可能是"*",这似乎表明将搜索所有加载的程序集(我还没有对此进行过大量测试)。这一部分对我来说不是问题,所以我不能评论您是否需要程序集名称或文件名(即,有或没有".dll"),尽管我已经看到这两个建议。

模型名部分应该是.edmx文件相对于程序集的名称和命名空间。因此,如果您有一个my.dataaccess程序集,并且在Models文件夹中创建dataModels.edmx,那么它的全名是my.dataaccess.models.datamodels。在这种情况下,元数据中会有"models.datamodels.(ext)"。

如果移动或重命名.edmx文件,则需要手动更新元数据字符串(以我的经验为例),记住更改相对命名空间将节省一些麻烦。


有几种可能的捕获物。我认为最常见的错误是连接字符串的这一部分:

res://xxx/yyy.csdl|res://xxx/yyy.ssdl|res://xxx/yyy.msl;

这不是魔法。一旦你理解了什么代表什么,你就可以得到正确的连接字符串。

首先是XXX部分。这只是一个程序集名称,您在其中定义了EF上下文clas。通常它类似于myproject.data。默认值为*表示所有加载的程序集。最好指定一个特定的程序集名称。

现在是YYY部分。这是xxx程序集中的资源名。它通常类似于.edmx文件的相对路径,带有点而不是斜线。例如,型号/目录-型号。目录获得应用程序正确字符串的最简单方法是构建XXX程序集。然后在文本编辑器中打开程序集dll文件(我更喜欢total commander的默认查看器)并搜索".csdl"。通常,该字符串的出现次数不会超过1次。

最终的ef连接字符串可能如下所示:

res://MyProject.Data/Models.Catalog.DataContext.csdl|res://MyProject.Data/Models.Catalog.DataContext.ssdl|res://MyProject.Data/Models.Catalog.DataContext.msl;


我在将我的.edmx数据库第一个模型从一个项目移动到另一个项目时遇到了这个问题。

我只是做了以下的事情:

  • 删除了app.configweb.config中的连接字符串
  • 删除了"model.edmx"
  • 将模型重新添加到项目中。

  • 这可能只是一个连接字符串错误,通过上面的过程可以解决这个错误,但是如果您在多个项目中使用该dll,那么确保正确地命名该连接字符串将确实修复该错误。


    在开发过程中,我将数据库第一个数据模型移到了另一个项目中。我的计划不好(或缺乏)。

    最初我有一个项目的解决方案。然后我向解决方案中添加了另一个项目,并从SQL Server数据库重新创建了我的数据库第一个数据模型。

    解决此问题-使用实体框架实体连接时出现元数据异常。我将connectionString从新的project web.config复制到原始的projectweb.config。但是,这发生在我将原始项目中的所有引用更新为新的数据模型项目之后。


    我在一个解决方案中有三个项目也有同样的问题,所有的建议直到我在网站项目的参考文件中引用了EDMX文件所在的项目后才起作用。


    正如ShirazBhaiji所回答的,元数据=res:///model.csdl res:///model.ssdl res:///model.msl就是这样。但是,基于模型本地化、名称空间和assemby名称构建适当的字符串仍然存在问题。非常简单的解决方案是在Visual Studio中重命名.edmx文件(重命名后返回原始名称),这会触发我的web.config中字符串的自动刷新。