2009-01-08 79 views
0

我们有三个表A,B,C.坚持三个相关表的nhibernate

A => ID,X

B => ID,Y

C => A.id,B.id

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

回答

0

从来没有必要自己做这个,但你可能想看看使用一些joined-table映射。

而对于事务操作,简单地说:

using(var session = TheSessionFactory.OpenSession()) { 
    using(var txn = session.BeginTransaction()) { 
     //transactional work 
     txn.Commit(); 
    } 
} 
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混淆。

0

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

借用Mark G's Answer中的映射。

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