2016-05-24 6 views
0

私はNHibernateにはかなり新しく、私はNHibernateマッピングで<joined-subclass>に存在する拡張テーブルから2つのカラムが必要なこの問題がありますが、適切な実装を見つけるのが最も困難な時期です。NHibernate <Join>内<joined-subclass>内または代替

以下は私の実装の簡略化されたバージョンです。私が最初に必要としていたことを達成する方法だと思っていましたが、NHibernateは<join><joined-subclass>に入れません。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="Sample.NHibernate" 
        namespace="Sample.NHibernate.ProgramAssociationAggregate" 
        default-access="property"> 

    <!-- Class definition --> 
    <class name="ProgramAssociation" table="ProgramAssociation" lazy="false"> 

    <!-- Composite primary key --> 
    <composite-id> 
     <key-property name="BeginDate" column="BeginDate" type="date" /> 
     <key-property name="OrganizationId" column="OrganizationId" type="int" /> 
     <key-property name="ProgramName" column="ProgramName" type="string" length="60" /> 
     <key-property name="ProgramTypeId" column="ProgramTypeId" type="int" /> 
     <key-property name="PersonId" column="PersonId" type="int" /> 
    </composite-id> 

    <!-- Optimistic locking for aggregate root --> 
    <version name="LastModifiedDate" column="LastModifiedDate" type="timestamp" /> 

    <!-- Transient state detection --> 
    <property name="CreateDate" column="CreateDate" type="DateTime" not-null="true" /> 

    <!-- Unique Guid-based identifier for aggregate root --> 
    <property name="Id" column="Id" type="guid" not-null="true" /> 

    <!-- Properties --> 
    <property name="EndDate" column="EndDate" type="date" /> 

    <!-- Derived classes --> 
    <joined-subclass name="Sample.NHibernate.ProgramAssociationAggregate.SpecialProgramAssociation" table="SpecialProgramAssociation" lazy="false"> 
     <key> 
     <column name="BeginDate" /> 
     <column name="OrganizationId" /> 
     <column name="ProgramName" /> 
     <column name="ProgramTypeId" /> 
     <column name="PersonId" /> 
     </key> 

     <!-- PK properties --> 
     <property name="PersonId" column="PersonId" type="int" not-null="true" insert="false" /> 
     <property name="ProgramTypeId" column="ProgramTypeId" type="int" not-null="true" insert="false" /> 
     <property name="BeginDate" column="BeginDate" type="date" not-null="true" insert="false" /> 
     <property name="ProgramName" column="ProgramName" type="string" length="60" not-null="true" insert="false" /> 
     <property name="OrganizationId" column="OrganizationId" type="int" not-null="true" insert="false" /> 

     <!-- Properties --> 
     <property name="IEPReviewDate" column="IEPReviewDate" type="date" /> 
     <property name="IEPBeginDate" column="IEPBeginDate" type="date" /> 
     <property name="IEPEndDate" column="IEPEndDate" type="date" /> 

     <!-- Trying to join this table, but NHibernate does not allow for this. What is the best way to accomplish essentially the same thing? --> 
     <join table="SpecialProgramAssociationExtension" schema="extension"> 
     <key> 
      <column name="BeginDate" /> 
      <column name="OrganizationId" /> 
      <column name="ProgramName" /> 
      <column name="ProgramTypeId" /> 
      <column name="PersonId" /> 
     </key> 
     <property name="IEPEventCode"/> 
     <property name="WrittenConsentDate" type="date"/> 
     </join> 

    </joined-subclass> 

    </class> 
</hibernate-mapping> 

NHibernateの経験が豊富な人は、私が必要としていることを達成する方法を知っていますか?

最近私はthis NHibernate resourceを使用していますが、この苦境にはあまり役に立たないことが証明されています。

私に指摘できるヒントやリソースがあれば幸いです。

ありがとうございます。

+0

ちょっとした注意:データベースモデルを変更できない限り、コンポジットキーは使用しないでください。このケースでのみサポートされています。それには多くのドローバックがあり、避けることができないときにはそれを使いこなす価値はありません。 –

答えて

0

あなたは可能性:

  • 変更クラスモデルの拡張のための別のクラスを持っていると1対1として、それをマッピングします。
  • SpecialProgramAssociationの値を格納するデータベースを変更します。
  • Joinサブクラスの代わりにサブクラスマッピングを使用し、SpecialProgramAssociationテーブルに結合し、そこから拡張子に結合します。これには、ディスクリミネータが必要なため、データベースモデルも変更する必要があります。
+0

この回答ありがとうございます。 これらのオプションを評価します。 データベースモデルの変更は、アーキテクチャがサードパーティによって作成されたパブリックプラットフォームの一部であるため、最も困難であることが判明する場合があります。 –

関連する問題