如何使用角色或组合在NHibernate中映射类

我相信这是一个常见的问题/问题,但未能找到一个干净简洁的答案。

问题

如何映射看似具有inheritance关系的实体:

Company Supplier Manufacturer Customer 

但是,供应商可以是制造商。

要么

 Person Doctor Patient Employee 

患者可以是医生,也可以是员工。

建议:使用角色

在NHibernate论坛的讨论中,响应通常是多重inheritance。

http://forum.hibernate.org/viewtopic.php?t=959076

他们建议的解决方案是使用组合或使用“角色”。 但是,我找不到任何关于如何做到这一点的例子或解释。

“赞成合成而非inheritance。” 还记得class上的小礼物吗? 在这种情况下,我必须同意你正在尝试多重inheritance – 在C#或Java(尚未)中是不可能的。 我个人会鼓励您考虑重新建模,因此您拥有一个Person对象,而一个人拥有一对多的角色集合。

您可能想要考虑使用角色。 因此角色将拥有一组人员。 或者一个人将拥有一组角色或两者兼而有之。 这可能意味着有一个将人员映射到角色的关联类。

使用人们共有的所有属性定义Person类。 然后定义一个Role超类和DoctorRole,PatientRole和EmployeeRole子类(假设每个角色都有不同的属性)。

Person类可以定义角色集合,Role类可以定义人员集合。 或者创建一个Association类可能更容易,我们称之为PeopleRole。

本页介绍了如何进行映射,以便PeopleRole是一个复合元素。 查看Order / Product / LineItem示例。 你的人就像Order,PeopleRole就像LineItem,Role就像Product。

在我看来,这更像是一个关于如何很好地建模域的问题,而不是NHibernate映射问题。

一旦你整理了你的域建模,我想你会发现NHibernate映射相对容易。

想要了解角色建模的一个地方就是寻找“ 颜色建模 ” – 杰夫德卢卡有一些资源 ,尽管这个想法起源于彼得科德

基本思想是将参与者的身份与他们在活动中扮演的角色分开。

例如,您可能有一个Person对象,用于捕获特定人员的身份。

然后,一个完全独立的对象“学生”,它捕获附加信息以记录作为学生的人的登记。 每个学生实例都会引用已注册的人。 单个人可能与许多“学生”记录相关,每个不同的注册一个记录。

与此同时,您可以拥有一个独特的“导师”对象,记录雇佣人员在一对一情况下教学生时的工作细节。 Tutor对象捕获有关如何雇用某人作为辅导员的其他详细信息。

这种结构给你很大的灵活性 – 一个人(Joe Bloggs)可能只是一个学生,另一个人(Jane Doe)可能只是一个导师,而第三个人(Chuck Norris)可能都是。

此外,引入另一个角色(讲师,标记,管理员)变得更容易,因为添加不需要更改现有对象。

我发现了一些你可能认为相关的评论:

在Naked Objects博客的博客文章中,概述了几种不同的方法,讨论了每种方法的优缺点。

  • 使用’Any’关联映射
  • 将角色建模为类