NHibernate不保存对象的项集合

Jos*_*osh 1 collections nhibernate

我有一个包含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>
Run Code Online (Sandbox Code Playgroud)

以下是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>
Run Code Online (Sandbox Code Playgroud)

以下是保存订单的代码如下所示:

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();
Run Code Online (Sandbox Code Playgroud)

知道为什么没有保存子OrderItems?

Lor*_*zCK 7

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

<list name="OrderItems" table="OrderItems" inverse="true" cascade="all">
  <key column="OrderID"/>
  <index column="OrderItemID" />
  <one-to-many class="OrderItem" />
</list>
Run Code Online (Sandbox Code Playgroud)

此外,由于集合标记为"反向",并且 - 在上面的示例中 - 您尝试保存新订单,您需要单独更新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();
}
Run Code Online (Sandbox Code Playgroud)


Dar*_*rov 5

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