【问题标题】:MetadataException when using Entity Framework Entity Connection [duplicate]使用实体框架实体连接时出现 MetadataException [重复]
【发布时间】:2009-07-02 13:28:29
【问题描述】:

这段代码:

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

【问题讨论】:

  • 请,请,请,请始终发布完整的异常,包括堆栈跟踪和内部异常。发布 ex.ToString() 的结果。
  • 希望你不要介意。我编辑了您的问题以修复格式。您应该缩进四个空格以格式化为代码。否则,选择代码并按下带有 10101 的按钮。

标签: entity-framework


【解决方案1】:

找到问题了。

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

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

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

【讨论】:

  • “某些情况”是指您拥有多个同名的 edmx 文件(例如 Model1)。
  • 我的“某些情况”是解决方案中只有一个 .edmx 文件。我不知道发生了什么,但这太可怕了。 ;)
  • 您提供的链接让我找到了答案,所以您得到了我的支持!我为此奋斗了半天。我试过 res://NameOfDLL/... 但没有成功。但是,我终于让它与 res://NameOfAssembly/ 一起使用...在这种情况下,它们是相同的名称,只是程序集名称最后没有 .dll。
  • 我在生成连接字符串后更改了模型的命名空间,在我按照您的说明修复了连接字符串并且它工作正常之后。
  • 我赞成,因为这解决了我的问题。谢谢!
【解决方案2】:

我有同样的错误信息,问题也是连接字符串的元数据部分,但我不得不更深入地挖掘来解决它,并想分享这个小金块:

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

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

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

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

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

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

【讨论】:

  • 谢谢!互联网上有 100 个答案,但这是对其中任何一个的最有用的附录。一个明显的例子:在DalProject.dll 中有一个文件夹Client,其中包含Client.edmx 文件。所以你然后用//DalProject/Client.Client.(csdl/ssdl/msl)替换//*/Client.(csdl/ssdl/msl)
  • 似乎是“My.DataAccess”。不需要;只有“Models.DataModels”部分(也许它与搜索的每个程序集根命名空间相关)。
【解决方案3】:

有几个可能的问题。 我认为最常见的错误是在连接字符串的这一部分:

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

这不是魔法。一旦你理解了它的含义,你就会得到正确的连接字符串。

首先是 xxx 部分。这只不过是您定义 EF 上下文类的程序集名称。通常它类似于 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 ;

【讨论】:

  • 在 dll 中搜索。超顶级提示。谢谢:)
【解决方案4】:

正如 Shiraz Bhaiji 回答的那样,metadata=res:///Model.csdl|res:///Model.ssdl|res://*/Model.msl 就是这种情况。 但是,我仍然无法根据我的模型本地化、命名空间和程序集名称构建正确的字符串。非常简单的解决方案是在 Visual Studio 中重命名 .edmx 文件(之后重命名并恢复为原始名称),这会触发我的 Web.config 中字符串的自动刷新

【讨论】:

    【解决方案5】:

    我在一个解决方案中的三个项目中遇到了同样的问题,直到我在网站项目的参考文件中引用了 edmx 文件所在的项目之前,所有建议都不起作用。

    【讨论】:

      【解决方案6】:

      我在开发过程中将我的 Database First DataModel 移到了另一个项目。就我而言,计划不周(或缺乏计划)。

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

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

          我只是做了以下事情:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-10
            • 2011-10-13
            相关资源
            最近更新 更多