【问题标题】:How to correctly reference a collection of Aggregates?如何正确引用聚合集合?
【发布时间】:2019-03-14 14:25:02
【问题描述】:

在 DDD 中,实体和聚合之间存在区别。在 EFCore 中,我对使用私有集合和使用规范模式在需要时填充子实体的方法感到满意。同样,Julie Lerman 和其他人撰写了关于将 EF 应用于 DDD 的非常好的文章。

与实体相反,聚合可以/应该只保存对另一个聚合的 Id 引用,而不是导航属性,我们可以使用它通过 GetById() 调用通过它的存储库拉回导航属性。

更多的问题是确定聚合如何保存对聚合集合的 Id 引用的集合以及如何使用实体框架来实现这一点?

通常您会使用导航属性和外键进行设置。

public Class Foo
(
  public List<Bar> Bars { get; set; }
)

但是,我希望与 DDD 保持一致。

public Class Foo
(
  public List<int> BarIds { get; set; }
)

我不想拥有 Bar 聚合,因为它知道它与 Foo 有关系,因为它可以被许多其他聚合引用。

是不是你不能在聚合上拥有聚合 ID 的集合?

【问题讨论】:

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


    【解决方案1】:

    如何正确引用聚合的集合?

    您通过其 id 引用聚合。因此,您通过 id 集合引用聚合集合(每个 id 引用一个聚合)。

    聚合如何保存对另一个聚合的 Id 引用

    很简单:另一个聚合的 id 是聚合中包含引用的字段。

    如何使用 Entity Framework 实现这一点?

    我不知道 EF,但聚合包含一个 id 引用,就像它包含聚合的任何其他字段一样。

    我不知道挣扎的原因。

    假设您有 2 个聚合:Foo 和 Bar,因此 Foo 引用 Bar (Foo ==> Bar)。如果 Foo 的客户端想要获取 Foo 实例引用的 Bar 实例:

    String aFooId = ...
    Foo aFoo = fooRepository.getById ( aFooId );
    String aBarId = aFoo.barId();
    Bar aBar = barRepository.getById ( aBarId );
    

    【讨论】:

    • 干杯,我已经编辑了我的问题,因为它更多是 EF 的实现问题,用于处理实体集合和聚合集合之间的区别。
    • 正如我在回答中所说,在 DDD 中,您必须通过其 id 引用另一个聚合,因此应通过保存其 id 的集合来引用聚合集合。无论 EF 是否允许您实现这样的 id 列表,我都不允许,但它就是这样做的。如果您无法保存 id 列表,另一种方法是仅保存关系另一端的 id,并在每次需要时执行查询以检索 id 列表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 2019-07-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 2018-04-07
    相关资源
    最近更新 更多