2012-04-04 2 views
0

複数の名前と値のペアと、一緒に属する行を識別するDomain列を含むDomainTypeという表があります。私は、PackageTypeとComponentTypeという2つのC#クラスを持っています。これらのクラスのデータは、同じ値の表に、それぞれ「PackageType」と「ComponentType」というドメイン値を持っています。私はこれらを定義するために私のhbm.xmlファイルでNHibernate discrimatorのコンセプトを使うことができると思ったが、私のアプリでPackageTypesをクエリするたびにDomainTypeテーブルからすべての行を返す。NHibernate Discrimator

マッピングロジック/構文が悪いのか、私がdiscriminatorsの概念を誤解しているのか分かりません。これらは結局サブクラスではないので、これは正しい戦略(?)ではないかもしれません。ここで

は私のPackageTypeテーブルのマッピングファイルです:

<class name="PackageType" table="DomainType" 
    discriminator-value="PackageType" dynamic-update="true"> 

    <id name="Id" column="Id" type="Int32" unsaved-value="0"> 
     <generator class="identity" /> 
    </id> 

    <discriminator column="Domain" type="AnsiString" not-null="true" /> 

    <property name="Description" column="Description" 
    type="AnsiString" length="100" not-null="true" /> 
</class> 

は、ここでドメインタイプテーブル(ものも含め、ドメイン= "COMPONENTTYPE")からすべての行を返すC#コードです:

IEnumerable<PackageType> rslt = GetSession().Query<PackageType>().ToList(); 
+0

Discriminatorsはサブクラスでしか動作しません(私は信じています) – Rippo

答えて

1

PackageTypeとComponentTypeの両方が継承する抽象クラスDomainTypeを定義し、次に両方のサブクラスのマッピングを含む単一のマッピングドキュメントDom​​ainType.hbm.xmlを作成する必要があります。これはNHibernateリファレンスドキュメントのTable-per-class-hierarchyを参照しています。

<hibernate-mapping namespace=" ... " assembly=" ... "> 
    <class name="DomainType" abstract="true" table="DomainType"> 
    <id name="Id" column="Id" type="Int32" unsaved-value="0"> 
     <generator class="identity" /> 
    </id> 
    <discriminator column="Domain" type="AnsiString" not-null="true" /> 
    <subclass name="PackageType" discriminator-value="PACKAGE"> 
     <property .../> 
    </subclass> 
    <subclass name="ComponentType" discriminator-value="COMPONENT"> 
     <property .../> 
    </subclass> 
    </class> 
</hibernate-mapping> 

次に、PackageTypeまたはComponentTypeのクエリを作成できます。

+0

これは私の質問の中心です:NHibernate **はこの新しい親クラスDomainTypeを人工的に導入する必要がありますか?私のモデルで?そうでなければ、それはクールです、私はそれで生きることを学ぶでしょう。しかし、NHibernateエンジンが人工親クラスを必要とせずに弁別子の概念を使用するのは十分に簡単なようです。このアプリケーションでは、DomainTypeクラスを直接使用することはありません。それは私のドメインでは役に立たず、私のモデルを勉強している時に、今は同僚を混乱させる可能性があります。 – sisdog