使用EF Core 3.X对聚合根进行建模

问题描述 投票:0回答:2

假设我有这些实体:

  • 客户
  • 订购
  • 产品

这三个都是聚合根,因为所有三个都需要彼此独立地加载和修改。由于聚合根不能包含其他聚合根,因此对于Order聚合根,我们需要几个其他实体:OrderCustomer和OrderProduct。这些是只读的,并且是Order的子级。这样,由于Order聚合需要客户和产品,因此它将加载只读的OrderCustomer和OrderProduct实体。订单永远不会加载客户或产品。

然而,这一切都说得通,我的问题是,如何在无法将多个模型映射到同一张表的EF Core中实施此操作?您是否将OrderCustomer和OrderProduct定义为非映射模型,并手动将它们加载到Order存储库中?我看不到任何其他方式可以做到这一点。

((请不要建议使用存储过程或直接使用SQL或类似方法)

domain-driven-design aggregateroot ef-core-3.0
2个回答
0
投票

OrderProductOrderCustomer可能不是实体,而是将其数据与Order一起保留的值对象。没有必要从现有的ProductCustomer表中获取数据,并且在某些情况下,这对您的数据完整性非常不利。

由于一个聚合不应包含对另一聚合的引用,因此,正如您所看到的,该想法是按ID引用相关的聚合。但是,如果您需要的不仅是ID,还需要更多信息,则按照您似乎正在考虑的思路,创建一个包含ID和一些相关位的值对象。我喜欢将特定于聚合的值对象作为嵌套类,以使它们明显地属于它们,但这是一种设计选择。

就“复制* Order中相关聚合的数据以重新构成值对象而言,请考虑代表一对”红色袜子”的Product。如果仅存储id,然后再存储同时使用商品ID提取商品说明,说明可能已更改为“蓝色袜子”,这将导致您的客户出现一些问题。将商品说明归一化为Order(通过OrderLine或[ C0])不会在这方面造成任何混淆,也不会造成公司内部差异,而不会影响客户,因为已订购了一双“红色袜子”。


0
投票

[使用EF Core时,如果OrderCustomer和OrderProduct是属于您的订单聚合根目录的实体,则可以像您所说的那样手动将它们加载到存储库中。这种方法没有错。实际上,Microsoft自己的体系结构指南就是这样做的。这是示例中的代码:

Order.Line
© www.soinside.com 2019 - 2024. All rights reserved.