ORM(NHibernate),DDD和保存复杂的实体

时间:2012-11-19 02:19:19

标签: nhibernate domain-driven-design

我是NHibernate的新手(坦白地说是DDD的概念)所以我的问题可能很简单或无关紧要,但如果有人帮我解决我的困惑,我会非常感激。

在我的应用程序中,我使用DDD和NHibernate作为ORM。

使用简单的实体它工作正常,但现在我处于我的实体变得非常复杂的阶段(因此实体A包含实体B和实体C的数组;并且每个实体C包含D和少数其他参数等等) ...)

我的客户端应用程序正在通过互联网与WCF服务(与数据库通信)进行通信,因此速度(以及有效负载大小非常重要)。在少数情况下,我必须从服务向客户端发送这些复杂DTO的数组,然后客户端更新A中的少量值并将其发送回服务器以进行保存/更新。

为了减少有效负载,我试图从我的DTO中的B和C实体中删除未使用的属性值,方法是在将数据从Service发送到客户端时在我的映射器中使它们无效(我没有使用自动播放器等)。

现在,当将实体保存回db时,我该怎么办?如果我在B和C的少数变量中传回具有空值的实体A(我在mapper中手动无效),NHibernate将在保存A时尝试保存B和C.我想只保存A,并且请求NHibernate不要保存B或C中的任何内容。

任何帮助,都会对我有所帮助。

提前致谢, d

1 个答案:

答案 0 :(得分:1)

在这种情况下的解决方案可以在预测中找到。简而言之:

  • 保持您的地图正确和复杂。
  • 但是在选择数据时,只需要将所需的列放入select子句中。

这可以通过Projections完成。很好的详细解释可以在这里找到:

http://shareyour-experience.blogspot.cz/2011/07/exploring-nhibernate-projections-and.html

文档:

http://nhibernate.info/doc/nh/en/index.html#querycriteria-projection

当数据将在服务器上返回时,完全映射的实体将能够保留所有属性。