NHibernate继承问题

时间:2009-07-05 15:50:15

标签: nhibernate inheritance nhibernate-mapping

目前我有以下课程:

类文章,包含属性id,标题和正文 class Question:带有额外PostedBy属性的文章

然后我有一个名为Article的表,其中包含上述属性,以及一个名为带有ID的问题的表,一个外键articleID和一个PostedBy。两者都有不同的模式

我想知道我的映射是如何表示这种关系的。这两个类都在不同的程序集中,我非常不愿意将问题逻辑放在Article class / mapping及其程序集中。

1 个答案:

答案 0 :(得分:2)

NHibernate支持三种基本的继承策略。

  1. 每个类层次结构的表
  2. 每个子类的表
  3. 每个具体类的表
  4. 听起来你正在寻找每个子类策略的表,因为你有一个Article类的表和另一个表的Question子类的额外属性。映射可能如下所示:

    <class name="Article" table="Article">
        <id name="Id" type="Int64" column="ArticleId">
            <generator class="native"/>
        </id>
        <property name="Title" column="Title"/>
        <property name="Body" column="Body"/>
        ...
        <joined-subclass name="Question" table="Question">
            <key column="ArticleId"/>
            <property name="PostedBy" column="PostedBy"/>
            ...
        </joined-subclass>
    </class>
    

    然而,这并不符合您希望将映射完全分开的愿望。您可以使用完全独立的映射,但这可能会产生一些副作用,因为允许将问题作为普通文章而不是问题加载。使用单独的映射,Article类将按预期直接进行。 Question类将包含一个连接,以访问存储在Article表中的属性。

    <class name="Article" table="Article">
        <id name="Id" type="Int64" column="ArticleId">
            <generator class="native"/>
        </id>
        <property name="Title" column="Title"/>
        <property name="Body" column="Body"/>
        ...
    </class>
    
    <class name="Question" table="Question">
        <id name="Id" type="Int64" column="QuestionId">
            <generator class="native"/>
        </id>
        <property name="PostedBy" column="PostedBy"/>
        ...
        <join table="Article">
            <key column="ArticleId"/>
            <property name="Title" column="Title"/>
            <property name="Body" column="Body"/>
        </join>
    </class>