2011-01-24 82 views
6

这里的NHibernate的歧视性的子类是我的层次结构:一个连接子类

 
class abstract Entity { /*members*/ } // mapped to entity table 
class abstract User : Entity { /*members*/ } // mapped to user table 

class Employee : User { /*no members*/ } // no table, discriminator = "E" 
class Contractor : User { /*no members*/ } // no table, discriminator = "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

联合子类没有鉴别器,因为它在单独的表中。这就是它如何知道子类是什么。如果你想使用鉴别器,你可以使用一张表作为所有的子类,并且你可以使用subclass作图

+0

联合子类可以在单独的文件中定义;然而,那不是重点。我想你错过了“独立表”是基于鉴别器的新的继承层次的根。也许你可以提供一个映射,它会做类似于我感到困惑的事情。 – 2011-01-24 18:32:46

+0

@Travis,有趣的重新加入子类。但是,您的用户映射仍然必须是子类,而不是联合子类,因为它在另一个表中。 – Vadim 2011-01-24 18:46:55