2011-03-11 122 views
1

這裏是我的代碼:NHibernate的一個一對多的映射:插入子項問題

Order order = new Order { ... }; 
OrderItem item = new OrderItem { ... }; 
order.Items.Add(item); 
item.Order = order; 

using(var tran = session.BeginTransaction()) { 
    session.Save(order); 
    // Without this, an exception will be thrown: Unexpected row count: 0; expected: 1 
    // session.Save(item); 

    tran.Commit(); 
} 

如果我取消對該行session.Save(item),它會插入的順序和項目。否則,它會拋出異常「意外行數:0;預期:1」。

如果我標誌着許多終端(項目屬性)的逆=「真」,沒有會拋出異常,但只插入訂購!訂單商品不會被插入到數據庫中。

如果我打電話session.Save(item)不調用session.Save(order),它插入的順序和它的項目。

如何在不致電session.Save(orderItem)的情況下保存訂單及​​其訂購商品,但只需致電session.Save(order)?謝謝!

這裏是我的映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Core" assembly="Core"> 
    <class name="Order" table="[Order]"> 
    <id name="Id"> 
     <generator class="assigned" /> 
    </id> 

    <property name="Name" /> 
    <bag name="Items"> 
     <key column="CategoryId" /> 
     <one-to-many class="Core.OrderItem, Core"/> 
    </bag> 
    </class> 

    <class name="OrderItem"> 
    <id name="Id"> 
     <generator class="assigned" /> 
    </id> 
    <property name="Title" /> 
    <many-to-one name="Order" column="OrderId" cascade="save-update" not-null="true" /> 
    </class> 

</hibernate-mapping> 

回答

5

因爲你沒有對Order.Items收集任何級聯,它不會自動在您保存在您的訂單爲您創建的項目。

但是你從項目做級聯順序,因此當您保存項目時,也會更新訂單。

當你指定逆=「真」,你告訴NHibernate的不自動更新「Item.Order」屬性,你會手動處理的。因此,當您將該命令添加到集合中時,該命令從不關聯,因此在提交之後永遠不會顯示。

我想你只需要添加:

<bag name="Items" cascade="all"> 

,它會創建,更新,刪除屬於訂單項目。

編輯:當然級聯那張放在包裏,而不是一個一對多節點。

+0

謝謝!我在錯誤的位置添加「級聯」屬性! :( – 2011-03-11 14:27:38

2

嘗試把級聯的次序來映射:

<bag name="Items" cascade="all"> 
    <key column="CategoryId" /> 
    <one-to-many class="Core.OrderItem, Core"/> 
</bag> 
+0

謝謝!我加上「級聯」屬性在錯誤的位置!:( – 2011-03-11 14:28:23