Сохранение трех связанных таблиц с использованием nhibernate - PullRequest
0 голосов
/ 08 января 2009

У нас есть три таблицы A, B, C.

Колонны

A => id, x

B => id, y

C => A.id, B.id

Для каждой строки в A будет строка в B. Чтобы связать A и B, мы используем C (мы не можем изменить дизайн таблицы). Мы должны сохранять информацию в одной транзакции. Есть ли способ сделать это с помощью NHibernate?

Ответы [ 3 ]

0 голосов
/ 08 января 2009

Это зависит от того, какова ваша структура класса или что вы ищете в структуре класса. Если это действительно единственные столбцы в таблицах, то этот способ кажется излишним и создает некоторые неоптимальные способы доступа к X & Y (classC.A.X & classC.B.X), но это будет работать. Возможно, у вас могли бы быть некоторые несохраненные свойства в ClassC, которые сделали бы эти вызовы более лаконичным способом.

<class name="ClassA" table="A">
   <id name="Id" column="ID">
      <generator class="native"/>
   </id>
   <property name="x" column="X" />
</class>

<class name="ClassB" table="B">
   <id name="Id" column="ID">
      <generator class="native"/>
   </id>
   <property name="y" column="Y" />
</class>

<class name="ClassC" table="C">
   <id name="Id" column="ID">
      <generator class="native"/>
   </id>
   <many-to-one name="A" class="ClassA" column="A_ID"/>
   <many-to-one name="B" class="ClassB" column="B_ID"/>
</class>

Если в С есть только эти столбцы, вы можете изменить это, чтобы использовать составной идентификатор (см. документы ). Затем, также в зависимости от ваших потребностей, вы можете настроить каскадирование так, чтобы вы когда-либо связывались с ClassC только до CRUD.

0 голосов
/ 28 июня 2010

То, что вы описываете здесь, является отображением таблицы «многие ко многим». есть свойство сопоставления «многие ко многим». это означает, что вам не понадобится сопоставление для таблицы C.

Чтобы заимствовать сопоставление из ответа Марка Г.

<class name="ClassA" table="A">
   <id name="Id" column="ID">
      <generator class="native"/>
   </id>
   <property name="x" column="X" />
   <bag name="List_Of_B" table="C" cascade="all">
      <key column="AId"/>
      <many-to-many column="BId"
         class="B"/>
   </bag>
</class>

<class name="ClassB" table="B">
   <id name="Id" column="ID">
      <generator class="native"/>
   </id>
   <property name="y" column="Y" />
   <bag name="List_Of_A" table="C" cascade="all">
      <key column="BId"/>
      <many-to-many column="AId"
         class="A"/>
   </bag>
</class>
0 голосов
/ 08 января 2009

Никогда не приходилось делать это самому, но вы можете посмотреть на использование некоторых joined-table отображений.

А для транзакционных операций просто:

using(var session = TheSessionFactory.OpenSession()) {
    using(var txn = session.BeginTransaction()) {
        //transactional work
        txn.Commit();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...