我们正在使用实体框架实现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/