6

我相信这是一个常见的问题/问题,但无法找到一个简洁明了的好答案。

问题

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

Company
  Supplier
  Manufacturer
  Customer

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

或者

Person
  Doctor
  Patient
  Employee

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

建议:使用角色

在 NHibernate 论坛上的讨论中,反应通常是这是多重继承。

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

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

“有利于组合而不是继承。” 还记得课堂上的那个小礼物吗?在这种情况下,我必须同意您正在尝试多重继承——在 C# 或 Java 中(还)不可能。我个人会鼓励您考虑重新建模,以便您拥有一个 Person 对象,并且一个人拥有一对多的角色集合。

4

3 回答 3

4

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

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

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

本页说明了如何进行映射,以使 PeopleRole 成为一个复合元素。查看 Order/Product/LineItem 示例。你的 Person 就像 Order,PeopleRole 就像 LineItem,Role 就像 Product。

于 2008-10-22T23:41:07.173 回答
3

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

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

了解角色建模想法的一个地方是寻找“颜色建模” - Jeff de Luca一些资源,尽管这个想法起源于Peter Coad

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

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

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

同时,您可以有一个独特的“Tutor”对象,当有人被聘请在一对一的情况下教授学生时,它会记录就业细节。Tutor 对象捕获有关某人如何被聘为导师的其他详细信息。

这种结构为您提供了极大的灵活性——一个人(Joe Bloggs)可能只是一名学生,另一个人(Jane Doe)可能只是一名导师,而第三个人(Chuck Norris)可能两者兼而有之。

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

于 2008-10-23T09:32:15.560 回答
1

我遇到了更多您可能会觉得相关的评论:

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

  • 使用“任何”关联映射
  • 将角色建模为类
于 2009-10-16T12:38:52.000 回答