2009-07-05 11 views
1

現在、私は次のクラスがあります。プロパティID、タイトルと本文 クラスの質問とNHibernateの継承の質問

Articleクラス:

その後、余分なPostedByプロパティを持つ記事私は上記の表は、との記事と呼ばれてきたがIDと外部キーのarticleIDとPostedByという質問を持つテーブルがあります。どちらも異なるスキーマにあります

この関係を表すためにマッピングがどのように見えるのかを知りたいと思います。両方のクラスは異なるアセンブリにあり、Articleクラス/マッピングとそのアセンブリに質問ロジックを入れるのは非常に嫌です。

答えて

2

NHibernateは、3つの基本的な継承戦略をサポートしています。

  1. クラス階層ごとのテーブル
  2. サブクラスごとのテーブル
  3. 具象クラスごとのテーブル

あなたはサブクラス戦略ごとのテーブルを探しているようにあなたがあなたの記事のクラスのためのテーブルを持っているように聞こえます質問サブクラスの余分なプロパティの別のテーブル。マッピングは次のようになる可能性があります。

<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> 

ただし、これはマッピングを完全に分離したままにしたいという希望には合いません。あなたは完全に別々のマッピングを持つことができますが、Questionに代わってQuestionを普通のArticleとしてロードできるようにする副作用があります。個別のマッピングを使用すると、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>