2009-04-17 47 views
1

我有一個Order類包含OrderItems。當我保存Order類時,數據庫被填充Order信息,但是沒有一個OrderItems被保存到它們各自的表中。這裏的次序來映射的樣子:NHibernate不保存對象的項目集合

<class name="Order" table="Orders"> 
<id name="OrderID" column="OrderID" type="Int64" unsaved-value="0"> 
    <generator class="identity"/> 
</id> 
<list name="OrderItems" table="OrderItems" inverse="true" > 
    <key column="OrderID"/> 
    <index column="OrderItemID" /> 
    <one-to-many class="OrderItem" /> 
</list> 

下面是OrderItem的映射是什麼樣子:

<class name="OrderItem" table="OrderItems"> 
<id name="OrderItemID" column="OrderItemID" type="Int64" unsaved-value="0"> 
    <generator class="identity"/> 
</id> 
<property name="OrderID" /> 
<many-to-one name="Order" class="Order" column="OrderID" not-null="true" /> 
</class> 

下面的代碼保存訂單的樣子:

if (o.CreatedBy == null || o.CreatedBy == string.Empty) { 
     o.CreatedBy = userID.ToString(); 
     foreach (OrderItem oi in obj.OrderItems) { 
      oi.CreatedBy = userID.ToString(); 
      oi.ModifiedBy = userID.ToString(); 
      oi.ModifiedOn = DateTime.Now; 
     } 
} 
o.ModifiedBy = userID.ToString(); 
o.ModifiedOn = DateTime.Now; 
ISession session = NHibernateHelper.GetCurrentSession(); 
ITransaction tx = session.BeginTransaction(); 
session.Save(o); 
tx.Commit(); 
NHibernateHelper.CloseSession(); 

任何想法爲什麼孩子OrderItems沒有被保存?

+0

你能張貼位你的代碼來展示你的對象是如何創建的建立關係,然後保存?你的映射看起來很好,所以我猜測它是代碼相關的。 – 2009-04-17 14:30:56

回答

7

要進行更新命令對訂單的所有兒童傳播,您需要啓用您的集合映射級聯更新:

<list name="OrderItems" table="OrderItems" inverse="true" cascade="all"> 
    <key column="OrderID"/> 
    <index column="OrderItemID" /> 
    <one-to-many class="OrderItem" /> 
</list> 

此外,由於收集被標記爲「逆」和 - 在上面的例子 - 你試圖保存一個新的秩序,你需要單獨更新OrderItem.Order財產,並就項目的更新()調用:

using(ITransaction tx = session.BeginTransaction()){ 
    session.Save(o); 
    foreach(var item in o.OrderItems){ 
     item.Order = o; 
     session.SaveOrUpdate(item); 
    } 
    tx.Commit(); 
} 
+0

糾正我,如果我錯了。在NHibernate中只能設置和包支持雙向關係,而不是列表。 – 2011-08-13 18:55:52

5

cascade="all"添加到您的集合映射中。

相關問題