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

时间:2008-10-22 18:10:27

标签: c# nhibernate

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

问题

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

Company
  Supplier
  Manufacturer
  Customer

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

Person
  Doctor
  Patient
  Employee

患者可以是医生或可以是员工。

建议:使用角色

在关于NHibernate论坛的讨论中,响应通常是多重继承。

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

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

  

“赞成合成而不是继承。”   记住这个小小的好东西   类?在这种情况下,我必须   同意你正在尝试多次   继承 - 在C#或C中不可能   Java(还)。我个人会的   鼓励你去思考   重新建模,所以你有一个人   对象和一个人有一对多   角色集合。

3 个答案:

答案 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 Lucasome resources,尽管这个想法源于{{3} }

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

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

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

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

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

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

答案 2 :(得分:1)

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

blog post on the Naked Objects blog中,概述了几种不同的方法,讨论了每种方法的优缺点。

  • 使用“任意”关联映射
  • 将角色建模为类