DDD:通过ID从其他聚合引用非根实体?

时间:2017-01-25 08:17:35

标签: c# sql-server entity-framework domain-driven-design

我们正在使用实体框架实现C#中的域模型实体以实现持久性。

根据过去的经验,我们现在正在努力构建小聚合,引用Id的其他根,正如Vaugh Vernon在本文中所建议的那样:http://www.informit.com/articles/article.aspx?p=2020371&seqNum=4

但在某些情况下,我们认为我们可能会通过Id引用其他聚合中的非根实体来破坏规则。例如,想象下面描述的模型。 具体请参见红色标记的关系。

显然,由于关系只是“通过Id”,我们不会破坏SystemAttribute聚合的封装。我认为这应该没问题。可以将AttributeValueId定义为值对象,如Vernon等人所建议的那样。

现在,如果我们觉得以这种方式引用非根实体是可以的,那么我们仍然会遇到问题。为了呈现给定UserGroup的所有AttributeValues的列表(当然具有拥有属性),我们需要执行基于EF查询的“SELECT WHERE IN”,而不是仅使用实际导航属性引用时可能的连接。我们还可以通过EF DBContext使用Raw SQL查询,利用我们在数据库中确实具有可连接的FK关系这一事实。

此处有任何想法或只是需要判断是否可接受的问题?

我非常喜欢使用Id的聚合之间的“软引用”的想法。但似乎并非没有问题。

<小时/> 关于在数据库中使用显式实体用于多对多关系表并决定不使其成为双向关系 - 分别参见Udi Dahan和Jimmy Bogard的这些文章:

https://lostechies.com/jimmybogard/2014/03/12/avoid-many-to-many-mappings-in-orms/

http://udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/

enter image description here

1 个答案:

答案 0 :(得分:2)

  

这里的任何想法或只是需要判断是否可接受的问题?

因此,首先想到的是,可以通过将UserGroupAttributeValue表从用户组聚合移动到系统属性聚合来来满足规则。

tomliversidge提出了正确的问题 - 这种安排看起来主要像结构;管理国家变革的规则是什么?您需要在每次更改时执行哪些一致性保证,哪些可以在有限的时间内解决?

我想补充一点:你确定你在正确的地方做吗? TDD的通常位置在您的核心领域(您的竞争优势所在的地方)。否则,您可能在错误的箱子里购物。 (注意:这更多是关于战略层面的,而不是战术实施模式中的。{/ p>