NHibernate分支子类的加入子类分类

6
这是我的继承结构:
class abstract Entity { /*成员*/ } // 映射到entity表
class abstract User : Entity { /*成员*/ } // 映射到user表
class Employee : User { /*没有成员*/ } // 没有表,鉴别器为“E” class Contractor : User { /*没有成员*/ } // 没有表,鉴别器为“C”
这是我在两个不同的hbm文件中的映射:
<class name="Entity" table="entity" xmlns="urn:nhibernate-mapping-2.2">
  <id name="Id" column="id">
    <generator class="guid.comb" />
  </id>
  <property ... />
</class>
<joined-subclass name="User" extends="Entity" table="user"> <key column="id" /> <discriminator column="type" /> <property ... /> <subclass name="Employee" discriminator-value="E" /> <subclass name="Contractor" discriminator-value="C" /> </joined-subclass>
以下是我收到的异常:

MappingException: XML验证错误:命名空间为'urn:nhibernate-mapping-2.2'的元素'joined-subclass'具有命名空间为'urn:nhibernate-mapping-2.2'的无效子元素'discriminator'。

我错过了什么?不能映射加入子类的鉴别子类继承结构吗?
2个回答

2

joined-subclass没有鉴别器,因为它在一个单独的表中。这就是它如何知道子类是什么。如果你想使用鉴别器,你需要为所有子类使用一个表,并使用subclass映射。


joined-subclasses可以在不同的文件中定义;然而,那并不是重点。我认为你错过了“独立表”是一个基于鉴别器的新继承层次结构的根源。也许你可以提供一个映射,做一些类似于我困惑的事情。 - Travis Heseman
@Travis,关于加入子类的想法很有趣。但是你的用户映射仍然必须是一个子类,而不是一个加入子类,因为它在另一个表中。 - Vadim

2

所以如果我理解正确,我不能混合使用不同的继承策略?基本上,如果每个类最终都是从一个基类(比如“实体”)继承而来的,那么我必须选择一种策略并将其应用于整个层次结构。我理解在同一级别无法混合使用,但未来是否有可能支持不同级别的混合使用呢? - Travis Heseman
1
@特拉维斯,你想为实体创建一张表的原因是什么? - Vadim
是的,所有我的实体都有6个共同的字段[Id、IsActive、DateCreated、Creator、DateModified、Modifier]。但即使我不需要实体,如果我需要扩展承包商或员工,用户也会在类似的情况下代替它。 - Travis Heseman
1
忽略您的“永远不要这样或那样”的评论(我可以将实体命名为其他好的基类名称),问题与在具有子类和孙子类后代的情况下可能始终发生的情况相同,其中一个被连接而另一个则被区分。 我想我根本不会使用类层次结构,即使对于表中仅有一列的实体,我也会使用表格-每个子类。 感谢文档。 - Travis Heseman
复杂的层次结构在性能方面不太适合映射到数据库。 - Diego Mijelshon
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接