C# 如何避免在添加子实体时保留整个聚合根?

C# 如何避免在添加子实体时保留整个聚合根?,c#,domain-driven-design,repository,repository-pattern,C#,Domain Driven Design,Repository,Repository Pattern,我有一个具有聚合根的域模型: public interface IAggregateRoot { public string Id { get; } public string Foo { get; set; } public int Bar { get; set; } public IList<IChildEntity> Children { get; } } 然后,我可以通过IAggregateRootRepository.GetById()

我有一个具有聚合根的域模型:

public interface IAggregateRoot {
    public string Id { get; }

    public string Foo { get; set; }
    public int Bar { get; set; }

    public IList<IChildEntity> Children { get; }
}
然后,我可以通过IAggregateRootRepository.GetById()获取一个IAggregateRoot实例,将该子级添加到Children集合,然后通过IAggregateRootRepository.AddOrUpdate()将其全部持久化,从而添加到Children集合中。然而,每次我添加一个子实体时,这将保留整个聚合根及其大量子实体集合。如果我的存储库看起来像:

public interface IAggregateRootRepository {
    public IAggregateRoot GetById(string id);

    public void AddOrUpdate(IAggregateRoot root);
    public void AddOrUpdate(IChildEntity child);
}
但是,正如我对存储库模式的理解,存储库应该只处理聚合根,而上面的解决方案肯定会打破这一要求


是否有其他更好的方法来避免此问题?

聚合根应围绕写入边界进行设计,即通常在单个批处理/事务中写入数据库的任何内容。如果您发现需要单独持久化不是根的子实体,那么可能需要重新考虑您的设计,并使子实体本身成为一个独特的聚合根(因为它有一个单独的写边界)

然后,原始聚合根将不包含子实体,而是包含对它们的引用(因为它们现在本身就是聚合根,聚合根之间的链接应该通过引用键)。这也将有助于您的延迟加载策略


希望有帮助:)

通常ORM负责数据库中整个聚合的更新。它检测在检索到的实体中所做的更改,并且只保留聚合中修改过的实体


因此,如果只向根添加一个子项,而在聚合中没有其他修改。然后ORM只会为子实体插入一条新记录,而只保留根聚合及其其他子记录。

获取子实体列表怎么样?这是原来的AggregateRotRepository还是新的ChildAggregateRepository的工作?或者这是否意味着子集合现在需要知道如何在父实体中加载自身?
public interface IAggregateRootRepository {
    public IAggregateRoot GetById(string id);

    public void AddOrUpdate(IAggregateRoot root);
    public void AddOrUpdate(IChildEntity child);
}