使用DDD,实体和聚合之间存在区别。在EFCore中,我很高兴使用私有集合并使用规范模式在需要时填充子实体。同样,Julie Lerman和其他人撰写了关于适应EF for DDD的非常好的文章。
与实体相对的Aggregate可以/应该只保存对另一个Aggregate的Id引用,而不是导航属性,我们可以使用它来通过GetById()
调用通过它的Repository撤回。
更重要的是确定聚合如何能够保存聚合集合的Id引用集合以及如何使用Entity Framework实现这一点?
通常,您可以使用导航属性和外键进行设置。
public Class Foo
(
public List<Bar> Bars { get; set; }
)
但是,我正在寻找与DDD保持一致的是。
public Class Foo
(
public List<int> BarIds { get; set; }
)
我不想要的是Bar
聚合知道它与Foo
有关系,因为它可以被许多其他聚合引用。
是否可能无法在Aggregate上拥有聚合ID集合?
如何正确引用聚合集合?
您通过其ID引用聚合。因此,您通过一组ID引用聚合集合(每个id引用一个聚合)。
Aggregate如何保存对另一个Aggregate的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 );