【问题标题】:The Infamous Entity Framework - Aggregate Root Issue臭名昭著的实体框架 - 聚合根问题
【发布时间】:2013-10-31 10:42:48
【问题描述】:

我偶然浏览了 StackOverflow 和 Google 等网站,但无法掌握如何实现它的概念。

这里我有一个非常简单的模型:一个Item 和一个ItemActivity。很明显Item是聚合根,ItemActivity是一个实体。

所以根据 DDD 原则,我应该只实现ItemRepository。除了它自己的 - 让我们说 - CRUD 操作之外,ItemRepository 还应该管理其子实体 ItemActivity 的 CRUD 操作。

还有一些实现问题:

  1. 我应该在域中实现子实体操作还是 存储库。
  2. 加载与项目相关的所有子实体或导航到它们 可以使用实体框架。使用.include(..) 加载根目录将 做这项工作。但是更新ItemActivity 甚至 删除ItemActivity?从集合中删除它们不会 坚持下去。
  3. 假设我必须找到一个时间跨度内的所有活动。如何 当我无法查询时,可以实现这样的查询吗 ItemActivity 或更糟的是不存在任何 ItemActivityRepository 。
  4. 是否有涵盖此主题的示例。有很多文章 写了很多没有具体代码和理论的答案 覆盖范围,但请提供任何真实样本。我工作过 Microsoft 西班牙 N 层 DDD 示例,但不够详细。

最好的问候。

【问题讨论】:

  • 不要误以为聚合根是子对象的容器。在定义任何域对象时,忘记任何与持久性相关的事情。这包括忘记关系数据库原则。

标签: entity-framework domain-driven-design aggregateroot


【解决方案1】:

1.我应该在域或存储库中实现子实体操作吗?

没有。存储库仅操作聚合。

2.使用实体框架加载与项目相关的所有子实体或导航到它们是可以的。使用 .include(..) 加载根目录将 做这项工作。但是更新 ItemActivity 甚至删除呢? 一个项目活动?从集合中删除它们不会持续存在。

  Item.getActivity().updateRemark("...");
  ItemRepository.store(Item);

3.假设我必须找到一个时间跨度内的所有活动。

如果需要按范围查询,最好将 ItemActivity 设为另一个聚合根。较小的聚合有助于这种情况。

4.Is there a sample covering this topic.

著名的Effective Aggregate Design。有一些示例代码(尤其是在第 1 部分中)与您的案例密切相关。

【讨论】:

  • 更新很简单但是怎么删除呢?从集合中删除项目只会删除关系,但会留下孤立项目
  • @LiviuM。我不熟悉实体框架,但我认为删除取决于您如何定义映射。在 JPA/Hibernate 中,如果子元素被映射为组件,则子元素会在从集合中移除时被删除。
  • 在 EF 中高达 6.1。事实并非如此。
猜你喜欢
  • 2012-01-09
  • 2017-10-03
  • 2023-01-27
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多