【问题标题】:NHibernate doesn't save object's collection of itemsNHibernate 不保存对象的项目集合
【发布时间】:2009-04-17 14:27:41
【问题描述】:

我有一个包含 OrderItems 的 Order 类。当我保存 Order 类时,数据库中填充了 Order 信息,但没有一个子 OrderItems 保存到它们各自的表中。下面是 Order 映射的样子:

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

【问题讨论】:

  • 您能否发布一些代码来展示您的对象是如何创建、建立关系以及如何保存的?您的映射看起来不错,所以我猜测它与代码相关。

标签: nhibernate collections


【解决方案1】:

要使更新命令在订单的所有子节点上传播,您需要在集合映射上启用级联更新:

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

此外,由于集合被标记为“反向”并且 - 在上面的示例中 - 您正在尝试保存一个新订单,因此您需要单独更新 OrderItem.Order 属性并对该项目发出 Update() 调用:

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

【讨论】:

  • 如果我错了,请纠正我。在 NHibernate 中,只有 set 和 bag 支持双向关系,但不支持 list。
  • 它在 OrderItem 中声明了 。有必要吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2010-10-06
    • 2019-11-17
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多