我认为这是一个常见的问题/问题,但未能找到一个干净简洁的答案。
问题
如何映射看似具有继承关系的实体:
Company
Supplier
Manufacturer
Customer
但是,供应商可以是制造商。
或
Person
Doctor
Patient
Employee
患者可以是医生或可以是员工。
建议:使用角色
在关于NHibernate论坛的讨论中,响应通常是多重继承。
http://forum.hibernate.org/viewtopic.php?t=959076
他们建议的解决方案是使用组合或使用“角色”。但是,我找不到任何关于如何做到这一点的例子或解释。
“赞成合成而不是继承。” 记住这个小小的好东西 类?在这种情况下,我必须 同意你正在尝试多次 继承 - 在C#或C中不可能 Java(还)。我个人会的 鼓励你去思考 重新建模,所以你有一个人 对象和一个人有一对多 角色集合。
答案 0 :(得分:4)
您可能想考虑使用角色。因此角色将拥有一组人员。或者一个人将拥有一组角色或两者兼而有之。这可能意味着有一个将人员映射到角色的关联类。
使用人们共有的所有属性定义Person类。然后定义一个Role超类和DoctorRole,PatientRole和EmployeeRole子类(假设每个角色都有不同的属性)。
Person类可以定义角色集合,Role类可以定义人员集合。或者创建一个Association类可能更容易,我们称之为PeopleRole。
This页面解释了如何进行映射,以便PeopleRole是一个复合元素。查看Order / Product / LineItem示例。你的人就像Order,PeopleRole就像LineItem,而Role就像Product。
答案 1 :(得分:3)
在我看来,这更像是一个关于如何很好地建模域的问题,而不是NHibernate映射问题。
一旦你整理了你的域建模,我想你会发现NHibernate映射相对容易掉线。
有一个地方想要了解建模角色的想法是寻找“Color Modeling” - Jeff de Luca有some resources,尽管这个想法源于{{3} }
基本思想是将参与者的身份与他们在活动中扮演的角色分开。
例如,您可能有一个Person对象,用于捕获特定人员的身份。
然后,一个完全独立的对象“学生”,它捕获附加信息以记录作为学生的人的注册。每个学生实例都会引用注册人。一个人可能与许多“学生”记录有关,每个记录对应一次。
与此同时,您可以拥有一个独特的“导师”对象,记录雇佣人员在一对一的情况下教学生的详细信息。 Tutor对象捕获有关如何聘请某人作为导师的其他详细信息。
这种结构给你很大的灵活性 - 一个人(Joe Bloggs)可能只是一个学生,另一个人(Jane Doe)可能只是一个导师,而第三个人(Chuck Norris)可能都是。
此外,引入另一个角色(讲师,标记,管理员)变得更容易,因为添加不需要更改现有对象。
答案 2 :(得分:1)