2009-04-17 105 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"添加到您的集合映射中。

相关问题