NHibernate Discrimator

本文关键字:Discrimator NHibernate | 更新日期: 2023-09-27 18:29:58

我有一个名为DomainType的表,它包含多个名称/值对以及一个用于标识属于一起的行的Domain列。我有两个C#类,称为PackageType和ComponentType,它们都在同一个表中存储数据,它们的Domain值分别为"PackageType"answers"ComponentType"。我想我可以在我的hbm.xml文件中使用NHibernate描述符概念来定义这些,但每次我在应用程序中查询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>

以下是C#代码,它返回DomainType表中的所有行(即使是Domain="ComponentType"的行):

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

NHibernate Discrimator

您需要定义PackageType和ComponentType都继承自的抽象类DomainType,然后创建一个包含两个子类映射的映射文档DomainType.hbm.xml。这可以参考NHibernate参考文档中的每个类层次结构的表。

<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的查询。

相关文章: