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

时间:2009-07-02 13:28:29

标签: 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

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

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

    int i = res.Count();
}

不会出错。

连接字符串是:

<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,元数据看起来还不错。

8 个答案:

答案 0 :(得分:111)

发现问题。

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

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

这在大多数情况下都能正常工作。但是,在某些(包括我的)实体框架中,混淆并且不知道要查看哪个dll。因此,将元数据字符串更改为:

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

虽然我有相反的问题,但没有在单元测试中工作,但在服务中工作。

答案 1 :(得分:45)

我有相同的错误消息,问题也是连接字符串的元数据部分,但我不得不深入挖掘解决它并希望分享这个小块:

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

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

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

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

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

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

答案 2 :(得分:14)

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

  

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

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

首先是 xxx 部分。除了你定义EF上下文clas的程序集名称之外别无其他。通常它会像 MyProject.Data 。 默认值为*,表示所有已加载的程序集。指定特定的程序集名称总是更好。

现在是 yyy 部分。这是 xxx 程序集中的资源名称。 它通常类似于.edmx文件的相对路径,带有点而不是斜线。例如。 模型/目录 - Models.Catalog 为应用程序获取正确字符串的最简单方法是构建 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 ;

答案 3 :(得分:0)

正如Shiraz Bhaiji回答的那样,meta = res:///Model.csdl | res:///Model.ssdl | res://*/Model.msl就是这种情况。  但是,基于我的模型本地化,命名空间和组合名称,我仍然遇到构造正确字符串的问题。非常简单的解决方案是在Visual Studio中重命名.edmx文件(之后重命名并返回到原始名称),这会触发我在Web.config中自动刷新字符串

答案 4 :(得分:0)

我在一个解决方案中遇到了同样的问题,并且在我将网站项目的参考文件中的引用引用到edmx文件所在的项目之前,所有建议都无效。

答案 5 :(得分:0)

我将数据库优先 DataModel 移动到开发过程中的另一个项目。我的计划不好(或缺乏计划)。

最初我有一个项目的解决方案。然后我在解决方案中添加了另一个项目,并从Sql Server数据库中重新创建了我的Database First DataModel

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

答案 6 :(得分:0)

它可能只是一个连接字符串错误,由上述过程解决,但如果您在多个项目中使用dll,那么确保连接字符串被正确命名将确保错误。

答案 7 :(得分:0)

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

我只是做了以下事情:

  1. 删除了app.configweb.config
  2. 中的连接字符串
  3. 删除了'Model.edmx'
  4. 将模型重新添加到项目中。