使用nhibernate持久保存三个相关表

时间:2009-01-08 12:41:57

标签: c# .net nhibernate

我们有三个表A,B,C。

A => id,x

B => id,y

C => A.id,B.id

对于A中的每一行,B中都会有一行。 要关联A和B我们使用C(我们不能改变表格设计)。 我们必须在一次交易中保留信息。有没有办法用NHibernate做到这一点?

3 个答案:

答案 0 :(得分:0)

我自己从未这样做,但您可能希望使用一些joined-table映射。

对于交易操作,只需:

using(var session = TheSessionFactory.OpenSession()) {
    using(var txn = session.BeginTransaction()) {
        //transactional work
        txn.Commit();
    }
}

答案 1 :(得分:0)

这取决于你的类结构是什么或你在类结构中寻找什么。如果那些真的是表中唯一的列,那么这种方式似乎有点过分,并且使得一些不太理想的方式来访问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>

如果C只有这些列,您可以将其更改为使用复合ID(查看docs)。然后,根据你的需要,你可以设置级联,所以你只有在CRUD去的时候才会搞乱ClassC。

答案 2 :(得分:0)

您在这里描述的是多对多表映射。有一个多对多的映射属性。这意味着您不需要表C的映射。

借用马克G的答案中的映射。

<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>