我們有三個表A,B,C.堅持三個相關表的nhibernate
列
A => ID,X
B => ID,Y
C => A.id,B.id
對於A中的每一行,都會有一行B. 要關聯A和B,我們使用C(我們不能更改表格設計)。 我們必須在一次交易中堅持信息。有沒有辦法使用NHibernate做到這一點?
我們有三個表A,B,C.堅持三個相關表的nhibernate
列
A => ID,X
B => ID,Y
C => A.id,B.id
對於A中的每一行,都會有一行B. 要關聯A和B,我們使用C(我們不能更改表格設計)。 我們必須在一次交易中堅持信息。有沒有辦法使用NHibernate做到這一點?
從來沒有必要自己做這個,但你可能想看看使用一些joined-table
映射。
而對於事務操作,簡單地說:
using(var session = TheSessionFactory.OpenSession()) {
using(var txn = session.BeginTransaction()) {
//transactional work
txn.Commit();
}
}
這取決於你的類結構,或者你正在尋找一個階級結構是什麼。如果這些實際上是表中唯一的列,那麼這種方式似乎有點矯枉過正,並且爲訪問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混淆。
這裏描述的是一個多對多的表映射。有一個多對多的映射屬性。這意味着您不需要表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>