• 我们可以通过对象引用来表达两个实体之间的关联(尽管聚合根与其内部实体之间的关系也可以通过根上定义的方法来表达--> )或通过从数据库中检索相关实体的存储库.
• 当通过Repository表达关系时,客户端会直接调用Repository来获取相关实体
• 如何表达关系取决于该关系是否存在SomeRootEnt.BorrowMeIntEnt(...)
是保持完整性所必需的(也许是行为是否需要关联才能表达自己)
1)如果关系(比如1:*)是通过Repository表达的,那么子实体是否需要包含父实体的ID(注意:这个问题假设至少有一个父实体是根或者它们都位于同一个总计的 )?
2)不同聚合中的实体之间的关系只能用ID来表示
a) 为什么?
b)这种关系本质上不是通过Repository表达的吗?
c) 如果b)是,这也表明在大多数情况下,不同聚合中的实体之间的关联不是为了支持特定行为而必需的?如果是,为什么?
更新:
2a)
用标识引用表达关系不同于用对象引用表达关系。应该用身份表示关系的原因是为了维护事务完整性——即在任何给定事务中只会修改单个聚合。如果使用对象引用,则事务可能会影响两个聚合。
我 - 我理解你想要表达的观点,因为如果关系将用对象引用来表达,那么仅仅是因为聚合 A1(正在修改)“物理”连接到另一个聚合 A2,这意味着A1 的一部分(即 A2 <--实际上 A2 并不是 A1 的一部分,但希望您理解这一点)与其他部分不同步?!
II - 但是从概念上讲,如果我们修改A1,那么即使两者之间的关系不使用对象引用来表达,两个聚合仍然是不同步的,所以实际上,A1和A2是否有什么区别?物理连接?
III - 无论如何,为什么我们不能在这两种情况下简单地使用最终一致性?
第二次更新:
原创_2)
需要明确的是,根实体(AR)之间的关系应该用身份来表示。应该禁止不同聚合中的非根实体之间的引用。
我们是否可以拥有只能从A1 非根实体 到A2 根实体的单向关联(即A1 中的非根实体将包含 A2 根的 ID)?
2) 一)
我。
如果使用对象引用,则事务可能会影响两个聚合。
它创造了在修改 A1 的事务中修改 A2 的可能性。通过身份引用 A2 消除了这种可能性。此外,在加载 A1 时,诸如数据库锁定之类的事情将不适用于 A2。
暂时忽略在更新 A1 时 DB 锁定不适用于 A2 的事实 - 为什么在某些情况下我们不应该允许在单个事务中同时修改 A1 和 A2?
我知道聚合定义了一致性边界,但是如果在极少数情况下我们需要 A1 和 A2 在同一个事务中同步,那么只有其他选择可能是将 A1 和 A2 转换为单个聚合,在该特定模型中可能不是合适的?!
谢谢