отображение nhibernate, соединение без первичных и внешних ключей - PullRequest
3 голосов
/ 12 февраля 2010

У меня есть эти устаревшие таблицы, к которым я получаю доступ с помощью nhibernate, базовый доступ к одной сущности - это нормально, но мне действительно нужно, чтобы объединения работали.

В идеале у меня был бы первичный и внешний ключ для определения объединений, но поскольку это устаревшие таблицы, у меня есть только составные идентификаторы, которые являются индексами для таблиц, индексы, которые использовались для повышения производительности, поэтому я не могу измениться.

В любом случае у меня есть таблица JobHeader и таблица свойств

В данный момент отображение JobHeader выглядит примерно так:


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="JobHeader " dynamic-update="true" table="JOB_HEADER">
    <composite-id>
      <key-property name="Company" column="JBH_COMPANY" type="String(6)" />
      <key-property name="ContractRef" column="JBH_CONTRACT_REF" type="String(10)" />
      <key-property name="JobRef" column="JBH_JOB_REF" type="String(10)" />
      <key-property name="Status" column="JBH_STATUS" type="String(10)" />
    </composite-id>
    <property name="RowId" column="TK_ROWID" type="Int32" not-null="true" />
    <property name="PropRef" column="JBH_PROP_REF" type="String(20)" not-null="false" />
  </class>
</hibernate-mapping>

И отображение свойств выглядит так:


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Property" dynamic-update="true" table="PROPERTY">
    <composite-id>
      <key-property name="Company" column="PRP_COMPANY" type="String(6)" />
      <key-property name="Reference" column="PRP_REFERENCE" type="String(20)" />
    </composite-id>
    <property name="RowId" column="TK_ROWID" type="Int32" not-null="true" />
    <property name="Name" column="PRP_NAME" type="String(40)" not-null="false" />
  </class>
</hibernate-mapping>

В Jobheader он использует «PropRef» для хранения свойства «Ссылка».

Я хотел бы создать новый файл сопоставления, который будет называться JobHeaderJoinedProperty И поэтому, возможно, будет выглядеть примерно так:


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="JobHeaderJoinProperty" dynamic-update="true" table="JOB_HEADER">
    <composite-id>
      <key-property name="Company" column="JBH_COMPANY" type="String(6)" />
      <key-property name="ContractRef" column="JBH_CONTRACT_REF" type="String(10)" />
      <key-property name="JobRef" column="JBH_JOB_REF" type="String(10)" />
      <key-property name="Status" column="JBH_STATUS" type="String(10)" />
    </composite-id>
    <property name="RowId" column="TK_ROWID" type="Int32" not-null="true" />
    <property name="PropRef" column="JBH_PROP_REF" type="String(20)" not-null="false" />  </class>
    <bag name="Property" fetch="join" >
      <key column="Reference" property-ref="PropRef" />
      <one-to-one class="Property"/>
    </bag>
  </class>
</hibernate-mapping>

Тогда надеемся, что моя сущность JobHeaderJoinedProperty сможет получить доступ к сущности Property со следующим:


public virtual Property Property
        {
          get
          {
            return this.property;
          }
          set
          {
            this.property = value;
          }
        }

Соединение двух устаревших таблиц через nhibernate не должно быть слишком сложным, верно?!

Я просто хочу скопировать внутреннее соединение, где sql будет выглядеть так:


Select * from job_header inner join property on property.reference = job_header.propref

1 Ответ

0 голосов
/ 28 августа 2012

Разве не однозначное сопоставление - все, что вам нужно?

<one-to-one
        name="PropertyName"                                (1)
        class="Property"                                  (2)
        cascade="all|none|save-update|delete"              (3)
        constrained="true|false"                           (4)
        fetch="join|select"                                (5)
        property-ref="PropertyNameFromAssociatedClass"     (6)
        access="field|property|nosetter|ClassName"         (7)
/>

Так что в вашем случае это будет

<one-to-one
        name="Property"                              
        class="ClassName"                                 
        property-ref="PropRef"  
/>

Источник http://www.nhforge.org/doc/nh/en/#mapping-declaration-onetoone

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...