65.9K
CodeProject 正在变化。 阅读更多。
Home

解析 Entity Framework EDMX 文件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.38/5 (7投票s)

2009年12月4日

CPOL

4分钟阅读

viewsIcon

59979

downloadIcon

1177

查看解析 Entity Framework EDMX 文件的方法。

引言

最近,我参与将软件集成到第三方应用程序中。为了集成到他们的系统中,我必须为每个实体对象创建多个 XML 文件。

手动完成这项工作将是一项非常耗时且徒劳的练习,因为可用的实体对象数量很多。一定有更好的方法……

背景

我环顾四周,希望能找到可以解析 EDMX 文件的一些东西。我找到的唯一一篇与此相关的文章是 CodeProject 上的这篇 - “在客户端生成自己的 ADO.NET Data Services 代理” 由 Valentin Billotte 撰写。

在这个时代,我不太喜欢用 XSL 来解析文件。我不想应付维护性和脆弱性。

由于我确实没有找到其他东西,我决定自己动手,并使用 LINQ to XML 构建了一个解析器。结果还可以,但我并不真正满意。它看起来是这样的:

private static SortedList<string,> GetEntityModelTypes(XNamespace edmxNS,
               IEnumerable<xelement> runtime, XNamespace schemaNS)
{
  var list = (from e in runtime.Elements(edmxNS + "ConceptualModels")
                .Elements(schemaNS + "Schema")
                .Elements(schemaNS + "EntityType")
              let properties = (from p in e.Elements(schemaNS + "Property")
                                select new EntityProperty
                                {
                                  Member = GetValue(p.Attribute("Name")),
                                  Nullable = GetValue(p.Attribute("Nullable"))
                                })

我的第一个尝试奏效了,并且易于维护,但是如果 Entity Framework 发生任何变化,我刚写完的代码就会在发布之前过时。

天哪,如果微软能给我们一种有意义的方式来获取数据就好了。

事实证明,他们做到了,但它不是很直观。我在寻找其他东西时偶然发现了这个解决方案。我找到的解决方案隐藏在“Entity Framework 的持久性无关(POCO)适配器”的代码中。

一旦你知道了获取根数据对象的秘密,那就没什么神秘的了。从那时起,就只是遍历数据结构并获取你想要的数据。本文的项目源代码将为你遍历数据结构,并将数据浓缩成新的数据结构,以便于使用。

解析 EDMX 文件的神奇代码可以归结为以下三行,并引用 System.Data.Entity.dll

public static EdmxEdmItemCollection ReadCsdlCollection(XElement edmx)
{
   var csdlNodes = edmx.Descendants(EdmxNamespace +
                            ConceptualModels).First().Elements();
   var readers = csdlNodes.Select(c => c.CreateReader());
   return new EdmxEdmItemCollection(readers);
}

要求

  • Visual Studio 2008 - 用于构建代码
  • T4 Toolbox - 运行 CodeGenerator\Driver.tt 模板所需
  • Visual T4 Visual Studio 插件(可选)

Using the Code

由于神奇的三行代码来自 Entity Framework POCO Adapter,我认为使用我的框架并结合 T4 来重新创建他们的对象是合适的。这将是一种快速合理的方式来验证我的框架是否按预期工作。虽然我不会讨论 T4 或如何使用它,但你可以在这里获取更多信息:

为了验证我使用 T4 创建的对象,我在解决方案文件夹中添加了一个 .bat 文件来运行 Entity Framework POCO Adapter 并生成要比较的文件。通过使用 diff 工具,我可以相当确定我正在解析和生成正确的输出。在运行 .bat 文件之前,请修改路径以匹配你的环境。

我应该指出,在撰写本文时,global.cs 文件是唯一不完全匹配但语法正确的。该文件基于通过外键连接的表。因此,存在一种关系,可以从任一表开始表示。该框架从两个角度表达了这种关系,但只需要为 global.cs 文件输出其中一个。我处理它们的顺序与另一个框架不同;这解释了差异。

运行代码

要创建对象,你需要右键单击 CodeGenerator\Driver.tt 文件,然后选择“运行自定义工具”。这将在 Output 目录中创建项目。

如果你想使用自己的 EDMX 文件,你需要打开 CodeGenerator\Driver.tt 并更改常量:edmxFilename = @"Model\NorthwindEF.edmx,以及新文件的路径。当你保存 Driver.tt 文件时,生成器将启动并自动重新生成对象。

祝你 EDMX 解析愉快……

历史

2010-06-02

  • 更新了模板文件。由于 T4 Toolbox 中的重大更改而进行了此更改。T4 Toolbox 的更改是由于 Visual Studio 2010 的更改。
  • 将当前代码移至 Version 1 文件夹。
  • 我为即将推出的项目创建了一个新版本。EdmxLibrary 已被彻底改写。我没有添加兼容的 T4 模板,但一个控制台应用程序将显示部分数据。
© . All rights reserved.