NHibernate显式多态性

NHibernate显式多态性,nhibernate,Nhibernate,我的基类映射: <class name="BaseClient,BackOffice.Core" table="client" polymorphism="explicit" > <id name="Id" unsaved-value="0" type="int"> <column name="id" not-null="true"/> <generator class="hilo"> <param name="max_l

我的基类映射:

<class name="BaseClient,BackOffice.Core"  table="client" polymorphism="explicit"  >
<id name="Id" unsaved-value="0" type="int">
  <column name="id" not-null="true"/>
  <generator class="hilo">
    <param name="max_lo">0</param>
    <param name="where">table_name = 'clients'</param>
  </generator>
</id>
<property name="Name" >
  <column name="name" length="1024"/>
</property>
所以我得到了这个sql

FROM bank_payment this_ 
left outer join client baseclient2_ on this_.client_source_id=baseclient2_.id 
left outer join transport_client

所以我的问题是为什么我会得到第二个sql,以及如何避免它。我认为显式多态性应该有帮助,但我有第二个加入。谢谢

您无法避免加入,原因很好:由于
客户端
存在,对
基本客户端
的任何引用都可能是
客户端

您特别要求NHibernate获取
ClientSource
,唯一的方法是使用join;否则,它可能会得到一个“不完整”的实例


“显式”多态性属性值所做的与此无关;仅针对该特定类型的查询(查看文档以获得更好的描述)

您无法避免加入,原因很好:由于
客户端
存在,任何对
基本客户端
的引用都可能是
客户端

您特别要求NHibernate获取
ClientSource
,唯一的方法是使用join;否则,它可能会得到一个“不完整”的实例


“显式”多态性属性值所做的与此无关;仅适用于该特定类型的查询(请查看文档以获得更好的说明)

好的,谢谢。如果我想得到“不完整”的实例,我该怎么办。BaseClient包含所有必需数据。那么您的域模型不正确。您应该使用一对一关系而不是继承。好的,谢谢。如果我想得到“不完整”的实例,我该怎么办。BaseClient包含所有必需数据。那么您的域模型不正确。您应该使用一对一关系而不是继承。
 <class name="BankPayment, BackOffice.Core"  table='bank_payment'>
    <id name="Id" unsaved-value="0" type="int">
      <column name="id" not-null="true"/>
      <generator class="native"/>
    </id>    
    <many-to-one name="ClientSource" class="BaseClient,BackOffice.Core" column="client_source_id" cascade="none"/>
ICriteria criteria = NHibernateSession.CreateCriteria(typeof(BankPayment));
criteria.SetFetchMode(BankPayment.Properties.ClientSource, FetchMode.Join);
FROM bank_payment this_ 
left outer join client baseclient2_ on this_.client_source_id=baseclient2_.id 
left outer join transport_client