0

我有一个名为 DomainType 的表,其中包含几个名称/值对以及一个 Domain 列,该列标识属于一起的行。我有两个名为 PackageType 和 ComponentType 的 C# 类,它们都将它们的数据存放在同一个表中,它们的域值分别是“PackageType”和“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>

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

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