2009-12-21 102 views
1

我说的流利NHibernate的主题,但我认为这是一个NHibernate的问题。但是,我不想通过遗漏细节来混淆事物。Fluent NHibernate DiscriminateSubClassesOnColumn问题

我使用流利NHibernate 1.0.0.593与NHibernate 2.1.0.4000。

首先讲一点背景...

我有我想要使用DiscriminateSubClassesOnColumn/SubclassMap.DiscriminatorValue功能NHibernate语法映射三个实现类的基类。子类代表我可以从三个不同的第三方数据提供者那里得到的响应。信息通常是相同的,但关系不同(一种响应类型可以有多个地址,另一个只能有一个,等等)。

我有流利的NHibernate提取NHibernate配置xml它正在生成和基于我的识别器和子类块应该看起来像什么配置似乎正在生成(这就是为什么我认为这是一个NHibernate的问题,而不是一个流利的NHibernate的问题)。

我看到的“问题”是,对于数据库中的初始查询,NHibernate似乎在扫描子类并在初始查询中执行所有一对一关系作为连接。由于某些子类具有与一对多关系相同的子类型,因此当我尝试检索其中一种类型时会导致错误。

我将发布生成的NHibernate配置以供参考。

任何人有任何想法如何控制这或可能是我做错了什么?

谢谢。

回答

0

不知道这是最好的答案,所以我仍然兴趣听其他的想法,但我发现一个修复。

将.Fetch.Select添加到子类上的任何HasOne关系似乎强制这些子类型的查询始终处于单独的SELECT中。在加入会更好的情况下,效率会降低,但它会使例外消失。

0
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true"> 
    <class xmlns="urn:nhibernate-mapping-2.2" discriminator-value="Unknown" name="PersonValidationResponse, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="PersonValidationResponse"> 
    <id name="ResponseId" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="pk_ResponseId" /> 
     <generator class="identity" /> 
    </id> 
    <discriminator type="PersonValidationResponseType, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
     <column name="ResponseType" /> 
    </discriminator> 
    <property name="CreatedBy" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="CreatedBy" /> 
    </property> 
    <property name="CreatedDate" type="System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="CreatedDate" /> 
    </property> 
    <many-to-one class="PersonValidationRequest, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Request"> 
     <column name="fk_RequestId" /> 
    </many-to-one> 
    <subclass name="ResponseTypeAResponse, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" discriminator-value="ResponseTypeA"> 
     <one-to-one cascade="all" class="PersonValidationAddress, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" foreign-key="fk_ResponseId" lazy="false" name="Address" property-ref="Response" /> 
     <one-to-one cascade="all" class="PersonValidationBiographic, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" foreign-key="fk_ResponseId" lazy="false" name="Biographic" property-ref="Response" /> 
     <one-to-one cascade="all" class="PersonValidationPhone, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" foreign-key="fk_ResponseId" lazy="false" name="Phone" property-ref="Response" /> 
     <property name="ResponseStatus" type="ResponseStatus, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
     <column name="ResponseStatus" /> 
     </property> 
     <property name="RawResponse" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="RawResponse" /> 
     </property> 
     <bag cascade="all-delete-orphan" lazy="false" name="Alerts" table="PersonValidationResponseAlert"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <many-to-many class="PersonValidationAlert, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
      <column name="fk_AlertId" /> 
     </many-to-many> 
     </bag> 
     <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="Scores" table="PersonValidationResponseScore"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <one-to-many class="PersonValidationScore, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bag> 
     <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="Exceptions" table="PersonValidationResponseException"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <one-to-many class="PersonValidationException, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bag> 
    </subclass> 
    <subclass name="ResponseTypeBResponse, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" discriminator-value="ResponseTypeB"> 
     <one-to-one cascade="all" class="PersonValidationWatchList, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" foreign-key="fk_ResponseId" lazy="false" name="WatchListHit" property-ref="Response" /> 
     <property name="ResponseStatus" type="ResponseStatus, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
     <column name="ResponseStatus" /> 
     </property> 
     <property name="RawResponse" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="RawResponse" /> 
     </property> 
     <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="Addresses" table="PersonValidationAddress"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <one-to-many class="PersonValidationAddress, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bag> 
     <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="Biographics" table="PersonValidationBiographic"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <one-to-many class="PersonValidationBiographic, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bag> 
     <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="Phones" table="PersonValidationPhone"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <one-to-many class="PersonValidationPhone, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bag> 
     <bag cascade="all-delete-orphan" lazy="false" name="Alerts" table="PersonValidationResponseAlert"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <many-to-many class="PersonValidationAlert, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
      <column name="fk_AlertId" /> 
     </many-to-many> 
     </bag> 
     <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="Scores" table="PersonValidationResponseScore"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <one-to-many class="PersonValidationScore, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bag> 
     <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="Exceptions" table="PersonValidationResponseException"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <one-to-many class="PersonValidationException, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bag> 
    </subclass> 
    <subclass name="ResponseTypeCResponse, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" discriminator-value="ResponseTypeC"> 
     <property name="ResponseStatus" type="ResponseStatus, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
     <column name="ResponseStatus" /> 
     </property> 
     <property name="RawResponse" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="RawResponse" /> 
     </property> 
     <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="Addresses" table="PersonValidationAddress"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <one-to-many class="PersonValidationAddress, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bag> 
     <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="Biographics" table="PersonValidationBiographic"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <one-to-many class="PersonValidationBiographic, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bag> 
     <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="CreditAccounts" table="PersonValidationCreditAccount"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <one-to-many class="PersonValidationCreditAccount, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bag> 
     <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="Phones" table="PersonValidationPhone"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <one-to-many class="PersonValidationPhone, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bag> 
     <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="WatchListHits" table="PersonValidationWatchList"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <one-to-many class="PersonValidationWatchList, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bag> 
     <bag cascade="all-delete-orphan" lazy="false" name="Alerts" table="PersonValidationResponseAlert"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <many-to-many class="PersonValidationAlert, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
      <column name="fk_AlertId" /> 
     </many-to-many> 
     </bag> 
     <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="Scores" table="PersonValidationResponseScore"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <one-to-many class="PersonValidationScore, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bag> 
     <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="Exceptions" table="PersonValidationResponseException"> 
     <key> 
      <column name="fk_ResponseId" /> 
     </key> 
     <one-to-many class="PersonValidationException, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bag> 
    </subclass> 
    <subclass name="UnknownResponse, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" discriminator-value="Unknown" /> 
    </class> 
</hibernate-mapping>