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();
您需要定义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的查询。