0

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

この時点で、マッピング ロジック/構文が悪いのか、それともディスクリミネータの概念を誤解しているだけなのかわかりません。これらは結局サブクラスではないので、これは正しい戦略ではないかもしれません (?)。

これが私の 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>

DomainType テーブルからすべての行 (Domain="ComponentType" の行も含む) を返す C# コードを次に示します。

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

1 に答える 1

1

PackageType と ComponentType の両方が継承する抽象クラス DomainType を定義し、両方のサブクラスのマッピングを含む単一のマッピング ドキュメント DomainType.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 のクエリを作成できます。

于 2012-04-05T10:45:34.187 に答える