DDD如何保存实体之间的关系?

Posted

技术标签:

【中文标题】DDD如何保存实体之间的关系?【英文标题】:DDD how to save relationship between entities? 【发布时间】:2017-05-05 07:55:00 【问题描述】:

我是 DDD 世界的新手,我想通过 ADO.NET 将它应用到我们的 DDD 应用程序中。 DDD中有实体、聚合根、值对象。我有两个实体,例如可能属于多个类别的博客文章。实际上我认为博客文章和类别都应该是聚合根。博客文章和类别都有一个存储库,PostRepository 和 CategoryRepository,但是现在我对如何实现帖子和类别实体之间的 1:many 关系的持久性感到困惑。

在DAO模式中,有一个DAO对应一个表,我们可以将关系持久化在DAO类中。但是在 DDD 中,有 Unit of work 的概念,它可以保证聚合根的正常工作,像这样,应该有一些关于聚合根的实体的存储库。但是对于关系,我认为它不应该有存储库,它不是这里的实体。

是否有解决这些情况的最佳实践?或者我应该添加两个过程(添加帖子,添加类别)并在我保存帖子时调用它们?

【问题讨论】:

What is the difference between DAO and Repository patterns?的可能重复 【参考方案1】:

每个聚合根应该有一个存储库。

如果您考虑对象的结构,例如您的帖子,那么聚合将是带有类别的帖子。 Post 将是聚合根。如果一个实体独立存在,您可以将其视为其自身的聚合根(只是一个对象的聚合)。因此,您创建存储库的规则是针对每个聚合根(或一个对象的单个实体)。

如果您将类别作为帖子聚合的一部分,那么您绝不能直接访问或修改类别。如果类别需要更改,则通过 Post 对象完成。如果这听起来不像您的域模型并且您正在考虑“但我想单独管理我的类别”,那么很有可能 Category 不属于 Post 聚合。如果不是,您可能希望将 Category 建模为它自己的实体,并通过 Post 实体的 id(不是对象引用)引用它。

然后如何继续为类别建模取决于您自己的域。 DDD经常发生这种情况。但这一切都很好。这只是意味着您为域建模的方式 100% 取决于您的特定域的工作方式。

【讨论】:

谢谢Adrian,这里我会单独管理分类。我使用一个表来存储帖子所属类别的关系,在带有实体框架的DDD中它会自动完成,如果没有ORM,是否有优雅的模式来保存帖子及其类别? 你可以使用类似 ADO.NET 的东西,首先删除现有的链接,然后重新插入它们。

以上是关于DDD如何保存实体之间的关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何添加没有相关实体但保存关系的实体?

是否可以保存引用未保存代理的实体?

EF 代码优先:如何在遵循 DDD 时从实体的集合中删除一行?

保存循环删除多对多CoreData关系的一端

如何通过学说实体之间的 ID 建立一对一的关系

如何阻止实体框架尝试保存/插入子对象?