получить PK сопоставленной таблицы с помощью NHibernate - PullRequest
0 голосов
/ 03 апреля 2009

только что начал с NHIbernate и имеет один вопрос, возможно, немного тупой! ;-) У меня есть 2 таблицы, электронная почта и вложение, электронное письмо может иметь ноль или более вложений. поэтому я создал файл HBM, как это:

<set name="Attachments" table="Attachments">
  <key column="EmailId" foreign-key="fk_Attachments_Emails"/>
  <composite-element class="Foo.Emails.Attachment, Foo.Emails">
    <!-- PROBLEM HERE!!! -->
    <property name="Id" column="Id" type="long"  />          
    <!-- END PROBLEM -->
    <property name="Name" column="Name" type="String" length="50"/>
    <property name="Mime" column="MimeType" type="String" length="50"/>      
    <property name="Size" column="Size" type="long" />
    <property name="FilePath" column="FilePath" type="String" length="256"/>
    <property name="Parsed" column="Parsed" type="Boolean" />
  </composite-element>
</set>

Поскольку я хочу иметь возможность искать вложения по PK (столбец Id в наборе), я включил его, но теперь каждый раз, когда я пытаюсь сохранить электронное письмо с вложениями, я получаю сообщение об ошибке из БД, когда Nhibernate пытается вставьте значение в PK, что, естественно, не разрешит моя БД.

Итак, мой вопрос: могу ли я извлечь pk для таблицы Attqachment, но запретить Nhiberntate писать его при вставке электронного письма / вложения? Должен ли я перейти к другому контейнеру, как ?? если так, вы сможете привести пример, когда я изо всех сил пытаюсь найти тот, который я понимаю!

Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 03 апреля 2009

Возможно, более практичный пример? Где у вас есть такая структура объекта:

E-mail
--EmailId
--EmailProperty1
--AttachmentCollection

Приложение
--AttachmentId
--ParentEmail
--AttachmentProperty1

сопоставлен со структурой таблицы следующим образом (не так, как я бы назвал, но это, например):

Адрес электронной почты
--emailId int PK, личность
--emailProp1 varchar (50)

emailattachment
--attachmentId int PK, личность
--emailId int, FK to email table
--attachmentProp1 varchar (50)

<hibernate-mapping>
        <class name="Email" table="email">
          <id name="EmailId">
            <!-- this tells NHibernate to use DB to generate id -->
            <generator class="native"/>
          </id>
          <property name="EmailProperty1" column="emailProp1"/>
          <bag name="AttachmentCollection" lazy="true" inverse="true">
            <key column="emailId"/>
            <one-to-many class="Foo.Emails.Attachment, Foo.Emails"/>
          </bag>
        </class>
        <class name="Attachment" table="emailattachment">
          <id name="AttachmentId">
            <generator class="native"/>
          </id>
          <property="AttachmentProperty1" column="attachmentProp1"/>
          <many-to-one name="ParentEmail" class="Foo.Emails.Email, Foo.Emails" lazy="proxy" column="emailId">
        </class>
    </hibernate-mapping>

На этой карте вы получите двунаправленное отношение, и этот тег генератора сообщает nhibernate, что объекты со свойством null Id (вы также можете указать другое «несохраненное значение»), затем вставляете объект, остальное обновление. Должно исправить вашу текущую проблему.

Пара других вещей: внимательно изучите, какие контейнеры вам нужно использовать при отображении (пакет против набора или списка). В hibernatingrhino NHibernateFAQ .

есть отличная рецензия.

Кроме того, поскольку вы новичок в NHibernate, я очень и очень рекомендую лето скринкастов nhibernate . Лучший инструмент, который я нашел до сих пор для изучения.

0 голосов
/ 03 апреля 2009

Я думаю, вы хотите двунаправленных отношений. Таким образом, вы можете перемещаться по ассоциации в обоих направлениях. Это включает в себя сгенерированные ключи ... Вот пример:

  <class name="Order" table="ORDERHEADER" lazy="false" >
<id name="OrderId" column="ORDERID" type="int">
  <generator class="sequence">
    <param name="sequence">"ORDERID_SEQ"</param>
  </generator>
</id>
<property name="OrderType" column="ORDERTYPE" type="Int16"/>
<bag name="OrderDetail" table="ORDERDETAIL" lazy="false" inverse="true">
  <key column="OrderId"/>
  <one-to-many class="OrderDetail"  />
</bag>

  <class name="OrderDetail" table="ORDERDETAIL" lazy="false">
<id name="OrderDetailId" column="ORDERDETAILID" type="int">
  <generator class="sequence">
    <param name="sequence">"ORDERDTLID_SEQ"</param>
  </generator>
</id>
<property name="OrderId" column="ORDERID" type="Int32"/>
<property name="ItemNumber" column="ITEMNUMBER" type="Int32"/>
<property name="OrderQuantity" column="ORDERQUANTITY" type="Int32"/>
<many-to-one name="Order" class="Order" column="OrderId" />

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