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;
我在将我的
我只是做了以下的事情:
这可能只是一个连接字符串错误,通过上面的过程可以解决这个错误,但是如果您在多个项目中使用该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中字符串的自动刷新。