FluentNH将“深层”关系模型映射到“扁平”域对象

时间:2010-11-17 22:07:03

标签: c# join fluent-nhibernate

以下是故事:网站(感兴趣的物理位置)有零个或多个联系人。这些联系人是与公司有关的人员,他们有权处理与本网站有关的事宜。

架构如下:

Person -< CompanyContact -< CompanySiteContact >- Site
  ||
  | -< PersonPhone
  |
   -< PersonAddress

我的切入点是网站。我需要联系人列表。在你到达Person之前,很少有人感兴趣的野外数据。所以,我想将Person,CompanyContact和CompanySiteContact折叠成一个域类。

我提出的选项:

  • 创建一个域类并使用FluentNH映射中的连接在检索数据时展平图层 。它从来没有听起来简单,我遇到了多级连接的问题(如果A连接B加入C,则无法在连接中指定连接到B的连接)。但是,我认为,如果可以指定连接,那只是一次性的事情,因此最终将成为最易维护的解决方案。

  • 在一组“DTO”中复制深度模型,这些“DTO”将1:1映射到表中,并且可以传递给“平面”域模型的构造函数。它有效,但感觉就像作弊一样(没有任何问题无法通过另一层抽象来解决,除了有太多的抽象层),而我的直觉告诉我,这会以某种方式最终导致比解决的更多问题。 / p>

  • 使用架构复制域模型1:1,并使用CompanySiteContact上的传递属性访问Person记录深度中的属性。同样,现在工作,但它并没有真正解决问题,并且每个感兴趣的新属性都需要更改映射,实际域类和顶级域类。不是很透明。

所以,Q是,我将如何构建映射?就像我说的,我无法在连接中指定连接。我认为我必须这样做的方法是映射每个表的PK,并在顶层的下一个连接中使用它,但我不确定如何设置它(没有使用FluentNH设置任何接近这个复杂的事情之前)。

2 个答案:

答案 0 :(得分:2)

我建议您创建域模型以与您的数据库紧密匹配。从那里我创建了DTO并使用AutoMapper进行展平。容易。

答案 1 :(得分:0)

感谢詹姆斯的回答; +1,但我不认为AutoMapper在这个时刻是必要的,而且我有点不安地包含一些能够“自动”完成工作的东西。我想到了更多的选择:

  • 在数据库中设置视图。这将起作用,因为由于业务规则,联系信息是只读的;我正在开发的应用程序必须永远不要直接更新联系人,因为不同的部门会维护此rolodex。

  • 按照James的建议,将我的域名1:1映射,但然后使用Linq查询将模型展平为DTO。此查询可以封装在Repository的帮助程序中,允许开发人员使用Repository上的相同方法直接查询DTO,而不是其他类。它比具有相同结果的视图更复杂,但它不需要更改架构。

我可能会选择第一个选项,并在必要时使用第二个选项。