2009-12-21 8 views
1

나는 주제에 유창한 NHibernate를 말했다. 그러나 나는 이것이 NHibernate 질문이라고 생각한다. 그러나, 나는 세부 사항을 빠뜨리는 것에 의해 물건을 혼란시키고 싶지 않았다.Fluent NHibernate DiscriminateSubClassesOnColumn Issue

나는 NHibernate 2.1.0.4000과 함께 Fluent NHibernate 1.0.0.593을 사용하고 있습니다.

먼저 약간의 배경 ...

나는 내가 DiscriminateSubClassesOnColumn/SubclassMap.DiscriminatorValue 유창함 NHibernate에 구문을 사용하여지도하기 위해 노력하고있어 세 가지 구현 클래스와 기본 클래스가 있습니다. 하위 클래스는 세 가지 다른 제 3 자 데이터 공급자로부터 얻을 수있는 응답을 나타냅니다. 정보는 일반적으로 동일하지만 관계가 다릅니다 (하나의 응답 유형은 여러 주소를 가질 수 있고 다른 응답 유형은 하나만 가질 수 있음 등).

나는 유창한 NHibernate가 NHibernate 구성을 추출했는데, discriminator와 subclass 블록이 어떻게 생겼는지에 대한 이해를 바탕으로 구성이 올바르게 생성되고있는 것 같습니다 (이것이 내가 NHibernate 질문, Fluent NHibernate가 아닌).

"문제"는 데이터베이스의 초기 쿼리에 대해 NHibernate가 하위 쿼리를 검색하고 초기 쿼리에서 조인으로 모든 일대일 관계를 수행하는 것 같습니다. 하위 클래스 중 일부는 일대 다 관계와 동일한 하위 유형을 가지므로 이러한 다른 유형 중 하나를 검색하려고하면 오류가 발생합니다.

생성 된 NHibernate 구성을 참조 용으로 게시 할 것입니다.

누구나이를 제어하는 ​​방법이나 내가 잘못하고있는 것에 대한 아이디어가 있습니까?

감사합니다.

답변

0

확실하지가 최선의 대답은, 그래서 난 여전히 다른 생각을 듣고 관심이 있어요,하지만 난 에게 수정 프로그램을 발견했다.

하위 클래스의 HasOne 관계에 .Fetch.Select를 추가하면 해당 하위 유형에 대한 쿼리가 항상 별도의 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>