MetadataException当使用entity framework实体连接

此代码:

using (EntityConnection conn = new EntityConnection("name=ELSCommonEntities")) { conn.Open(); } 

给我以下错误:

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

使用以下堆栈跟踪:

 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 

但是,这个代码使用了相同的连接string:

 using (ELSCommonEntities db = new ELSCommonEntities()) { var res = from c in db.Logging select c; int i = res.Count(); } 

不会给出错误。

连接string是:

 <add name="ELSCommonEntities" connectionString="metadata=res://*/Common.CommonModel.csdl|res://*/Common.CommonModel.ssdl|res://*/Common.CommonModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost;Initial Catalog=els5_demo;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 

我也打开了dll的reflection和元数据看起来不错。

发现问题。

标准元数据string如下所示:

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

这在大多数情况下工作正常。 但是,在一些(包括我的)entity framework得到困惑,不知道要查看哪个DLL。因此,将元数据string更改为:

 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

虽然我有相反的问题,但没有在unit testing中工作,而是在服务中工作。

我有同样的错误信息,问题也是连接string的元数据部分,但我不得不深入一点来解决它,并希望分享这个小块:

元数据string由三部分组成,每部分如下所示:

 res:// (assembly)/ (model name).(ext) 

其中ext是“csdl”,“ssdl”和“msl”。

对于大多数人来说, 程序集可能是“*”,这似乎表明所有加载的程序集都将被search(我还没有做过大量的testing)。 这部分对我来说不是问题,所以我不能评论你是否需要程序集名称或文件名(即有或没有“.dll”),尽pipe我已经看到了这两个build议。

模型名称部分应该是您的.edmx文件的名称和命名空间 ,相对于您的程序集。 所以,如果您有一个My.DataAccess程序集,并且在Models文件夹中创buildDataModels.edmx ,则其全名是My.DataAccess.Models.DataModels 。 在这种情况下,您的元数据中将包含“Models.DataModels。(ext)”。

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

有几个可能的捕获。 我认为最常见的错误是在连接string的这一部分:

RES://xxx/yyy.csdl |高分辨率://xxx/yyy.ssdl |资源://xxx/yyy.msl;

这不是魔术。 一旦你明白了什么是你会得到正确的连接string。

首先是xxx部分。 这不是别的,而是你定义你的EF上下文类的程序集名称。 通常它会像MyProject.Data 。 默认值是*,代表所有加载的程序集。 指定一个特定的程序集名称总是更好。

现在是yyy部分。 这是xxx程序集中的资源名称。 它通常会像使用点而不是斜杠的.edmx文件的相对path。 例如模型/目录Models.Catalog为应用程序获取正确string的最简单方法是构buildxxx程序集。 然后在文本编辑器中打开程序集dll文件(我更喜欢Total Commander的默认查看器)并search“.csdl”。 通常不会有一个以上的string出现。

您的最终EF连接string可能如下所示:

RES://MyProject.Data/Models.Catalog.DataContext.csdl |高分辨率://MyProject.Data/Models.Catalog.DataContext.ssdl |资源://MyProject.Data/Models.Catalog.DataContext.msl;

正如Shiraz Bhaiji所回答的,元数据= res:///Model.csdl | res:///Model.ssdl | res://*/Model.msl就是这种情况。 不过,我仍然有问题,build立在我的模型本地化,命名空间和assembly名称正确的string。 非常简单的解决scheme是在Visual Studio中重命名.edmx文件(在重命名并返回到原始名称之后),这会触发Web.config中string的自动刷新

我在一个解决scheme中遇到了三个项目的相同问题,直到我在网站项目的参考文件中引用了edmx文件所在的项目时,所有的build议都不起作用。

我把我的数据库第一DataModel中途通过发展移动到一个不同的项目。 我的计划不好(或缺乏)。

最初我有一个项目的解决scheme。 然后,我又添加了另一个项目的解决scheme,并从Sql Server数据库重新创build我的数据库第一DataModel

修复这个问题 – 使用entity framework实体连接时的MetadataException 。 我将我的ConnectionString从新的Project Web.Config复制到原始项目Web.Config 。 但是,这发生在我将原始项目中的所有引用更新为新的DataModel项目之后。

它可能只是一个连接string错误,这是通过上述过程解决,但如果您在多个项目中使用DLL,然后确保连接string正确命名将修复错误肯定。

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

我只是做了以下几点:

  1. 删除app.configweb.config的连接string
  2. 删除了“Model.edmx”
  3. 将模型重新添加到项目中。