【问题标题】:Mapping Entity Framework auto generated entities to Data Transfer Objects?将实体框架自动生成的实体映射到数据传输对象?
【发布时间】:2011-09-06 21:43:43
【问题描述】:

使用 Entity Framework 4.1 将自动生成的实体框架实体映射到适合数据传输的对象的最佳方法是什么?

我正在处理的内容如下所示:

WPF Application -> WCF Service -> Entity Framework (DAL) -> Database

除了 WPF 应用程序之外,还可以将 WPF 应用程序换出到 ASP.NET 网站。因此使用了 WCF 服务。

WCF 服务、数据库和实体框架代码都将位于同一物理层。

在以前版本的实体框架(4.0 之前)中,我相信您必须为您的类编写自己的映射代码。现在有更好的方法吗?

另外一个问题是,在 DTO 中包含执行业务逻辑的方法是否是一种不好的做法?在这种情况下,应用业务逻辑的最佳位置在哪里?

【问题讨论】:

    标签: wcf entity-framework architecture


    【解决方案1】:

    从 EF 实体映射到 DTO 的最佳方式是到 project。我在此处链接的示例使用视图模型而不是 DTO,但想法是相同的。

    对于大多数 ORM,包括 EF,如果您只需要一个 DTO,则实现实体是有成本的,您不需要支付。费用包括:

    • 修复 -- 当两个对象引用同一个相关对象时,确保它们指向同一个实例。
    • 跟踪 -- 在上下文中跟踪实例的开销。
    • 不必要的列 - 您可能不需要 DTO 的所有属性。
    • 聚合 -- 像 .Count() 这样的函数在 SQL 中比在对象空间中的效率要高得多。

    如果您使用 L2E 投影,则不会产生任何此费用。如果您按照常见建议使用 AutoMapper 锤子解决每一个看起来像钉子的问题,那么您支付全部的费用。

    我同意@sternr 关于不将方法放在实体/DTO 上的观点。有关此想法的更详细检查,请阅读“At the Boundaries, Applications are Not Object-Oriented”。

    【讨论】:

      【解决方案2】:

      使用AutoMapper 在简单的 DTO 和 EF 实体之间进行映射

      [编辑:]您的其他问题:

      对于映射:您可以使用内置的 edmx 设计器,它允许您使用现有的 DB 架构来生成模型实体,或者反过来(定义您的实体,并让 EF 创建您的 DDL)。 较新的版本(从 4.1 开始)您可以简单地对实体进行编码并在相关属性上添加 DataAnnotations,EF 将执行魔术映射 (here's a good sample)

      至于向 DTO 添加逻辑,根据 DTO 的定义,DTO 是一个数据联系人 - 消费者可能会创建自己的实现(通过自动代理或其他手动包装器实现),因此在其中放置逻辑有点没有意义。

      【讨论】:

      • AutoMapper 确实很不错,我也建议你看看发表在Sam's Code 博客上的优秀文章。他正在使用 T4 模板为 AutoMapper 自动生成 DTO 和映射配置。此后,他在 codeplex 上以项目 loef 的形式发布了代码。
      • AutoMapper 是一个从 EF 实体到 DTO 的可怕工具,因为它不支持 IQueryable 或 EF 投影。同意方法。
      猜你喜欢
      • 2015-02-15
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多