【问题标题】:Does DDD and Automapper defeat lazy loading?DDD 和 Automapper 会打败延迟加载吗?
【发布时间】:2013-09-20 09:13:57
【问题描述】:

我正在开发一个 n 层域驱动设计项目,该项目使用 Entity Framework 4 DB-First 和 Automapper 在域的命名空间中生成 POCO。

澄清一下:EF 项目返回 MyProject.Repositories.EF.Entities 命名空间中的实体,我使用 Automapper 将它们转换为 MyProject.Domain.Entities 中的实体> 命名空间。

现在,我无法确定当我在 EF 和 Domain 实体之间进行映射时,是否枚举了所有集合属性,即在映射时是否还从数据库中检索了所有相关数据,或者是否当我在代码中实际枚举它们时,它们仍然只是延迟加载。

我担心明显的性能影响。

【问题讨论】:

  • 为什么不是代码优先?你会避免一些问题..
  • 客户首先明确要求 DB。
  • 你是指使用 Project.To 吗?

标签: c# entity-framework entity-framework-4 automapper


【解决方案1】:

原来答案是否定的。只要您在两个 IEnumerable 之间进行映射,实际的枚举只会在您执行 foreach、ToList() 等操作时发生。如果您不对这些对象的 IEnumerable 属性执行操作,则永远不会发生枚举并且相关的数据将不会被检索。

【讨论】:

  • 我认为这是错误的。我目前遇到了这个问题,我的 DAL 实体上的导航属性是通过从 ICollection 映射到 ICollection 来加载的。
  • @victor ICollection 必须被实现(它有一个计数)。迭代过程中只能生成 IEnumerable。
【解决方案2】:

长话短说 - 这不是 AutoMapper 关心的问题,而是你如何使用 ORM 的问题。 AutoMapper 只是删除了您已经编写的代码,因此如果您针对您的 ORM 编写了性能不佳的代码,AutoMapper 将很乐意提供帮助。

人们在使用 AutoMapper 之前、使用 AutoMapper 以及使用 AutoMapper 之后都在滥用 ORM。正确使用延迟加载是一个强大的工具,但仍然可能被滥用。使用延迟加载并不妨碍开发人员了解幕后实际发生的事情。

所以请使用 AutoMapper,但要小心您的抓取,就像您不使用 AutoMapper 时应该做的那样。

【讨论】:

  • 问题是automapper是否枚举了IQueryable集合属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多