Entity framework core 如何正确引用聚合集合?

Entity framework core 如何正确引用聚合集合?,entity-framework-core,domain-driven-design,Entity Framework Core,Domain Driven Design,对于DDD,实体和集合之间存在区别。在EFCore中,我对使用私有集合和在需要时使用规范模式填充子实体的方法感到满意。同样,朱莉·勒曼和其他人也写了很好的文章,介绍了如何将EF应用于DDD 与实体相反,聚合只能/应该保存对另一个聚合的Id引用,而不是导航属性,我们可以使用导航属性通过GetById()调用通过它的存储库将其回调 更大的问题是确定聚合如何保存对聚合集合的Id引用集合,以及如何使用实体框架实现这一点 通常,您会使用导航属性和外键进行设置 public Class Foo ( pu

对于DDD,实体和集合之间存在区别。在EFCore中,我对使用私有集合和在需要时使用规范模式填充子实体的方法感到满意。同样,朱莉·勒曼和其他人也写了很好的文章,介绍了如何将EF应用于DDD

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

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

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

public Class Foo
(
  public List<Bar> Bars { get; set; }
)
公共类Foo
(
公共列表栏{get;set;}
)
然而,我想要的是与DDD保持一致

public Class Foo
(
  public List<int> BarIds { get; set; }
)
公共类Foo
(
公共列表barid{get;set;}
)
我不想要的是
Bar
聚合,因为它与
Foo
有关系,因为它可以被许多其他聚合引用

是否可能在聚合上不能有聚合ID的集合

如何正确引用聚合集合

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

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

很简单:另一个聚合的id是聚合中保存引用的字段

如何使用实体框架实现这一点

我不知道EF,但聚合保存id引用的方式与它保存聚合的任何其他字段的方式相同

我不知道斗争的原因

假设您有两个聚合: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列表