代码之家  ›  专栏  ›  技术社区  ›  NFrank

Fluent NHibernate区分子类列问题

  •  1
  • NFrank  · 技术社区  · 16 年前

    我说了一口流利的NHibernate,但我认为这是一个NHibernate问题。但是,我不想遗漏细节而混淆事情。

    我用的是Fluent NHibernate 1.0.0.593和NHibernate 2.1.0.4000。

    首先是一些背景…

    我有一个基类,其中有三个实现类,我正试图使用distingSubclassesonColumn/subclassmap.discriminatorvalue fluent nhibernate语法映射它们。子类表示我可以从三个不同的第三方数据提供者那里得到的响应。信息通常是相同的,但是关系是不同的(一个响应类型可以有多个地址,另一个只能有一个地址,等等)。

    我用fluent nhibernate提取了它生成的nhibernate配置xml,基于我对鉴别器和子类块应该是什么样子的理解,配置似乎生成正确(这就是为什么我认为这是一个nhibernate问题,而不是一个fluent nhibernate问题)。

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

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

    有人对如何控制这件事或者我做错了什么有什么想法吗?

    谢谢。

    2 回复  |  直到 16 年前
        1
  •  0
  •   NFrank    16 年前
        <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>
    
        2
  •  0
  •   NFrank    16 年前

    不确定这是最好的答案,所以我仍然有兴趣听到其他的想法,但我发现 修理。

    将.fetch.select添加到子类上的任何hasone关系中,似乎会强制这些子类型的查询始终位于单独的select中。在那些联接更好的情况下,它的效率会降低,但它会使异常消失。