2016-05-24 4 views
0

Я довольно новичок в NHibernate, и у меня есть эта проблема, когда мне нужно два столбца из таблицы расширений, которые должны присутствовать на <joined-subclass> в моем сопоставлении NHibernate, но у меня есть труднее всего найти соответствующую реализацию.NHibernate <Join> в рамках <объединенного подкласса> или альтернативы

Ниже приведена упрощенная версия моей реализации и то, что я изначально думал, было бы способом выполнить то, что мне нужно, но 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

Вы можете:

  • изменить модель класса, чтобы иметь еще один класс для расширения и отобразить его в качестве одного взаимно.
  • изменить базу данных для сохранения значений в SpecialProgramAssociation
  • использовать подклассовое сопоставление вместо объединенного подкласса и присоединиться к таблице SpecialProgramAssociation и оттуда к расширению. Это требует также изменения модели базы данных, поскольку вам нужен дискриминатор.
+0

Благодарим вас за этот ответ. Оцените эти параметры. Изменение модели базы данных может оказаться самым сложным, поскольку архитектура является частью публичной платформы, созданной третьей стороной. –