我要新增一张销售订单,分别由订单和订单明细组成,正常情况下新增没有问题。
当必填项为空保存失败回滚后,填入必填项却怎么都保存不了。断点看了下订单和订单明细的对象中该赋的值都有了,迷茫。
//订单类
    public class T_Order 
    {
        protected string _id;
        protected IList _orderDetail;        virtual public string Id
        {
            get { return _id; }
            set { _id = value; }
        }        virtual public IList DetailList
        {
            get
            {
                if (_orderDetail == null)
                {
                    _orderDetail = new ArrayList();
                }
                return _orderDetail;
            }
            set { _orderDetail = value; }
        }    }//订单明细类
    public class T_OrderDetail
    {
        protected string _id;
        protected T_Order _order;        virtual public string Id
        {
            get { return _id; }
            set { _id = value; }
        }        virtual public T_Order Order
        {
            get { return _order; }
            set { _order = value; }
        }
    }实现代码如下://增加明细事件
private void btnAddRow_Click(object sender, EventArgs e)
{
   T_OrderDetail od = dtsOrderDetail.AddNew() as T_OrderDetail;
   _order.DetailList.Add(od);
}//保存事件
private void btnSave_Click(object sender, EventArgs e)
{
   Save(_order);
}//保存订单
private void Save(T_Order order)
{
   foreach (T_OrderDetail listObject in order.DetailList)
   {
       listObject.Order = order;
   }   try
   {
       ITransaction tx = NHHelper.Instance.GetSession().BeginTransaction();
       NHHelper.Instance.GetSession().Save(order);
       tx.Commit();
   }
   catch (Exception e)
   {
       tx.Rollback();
   }
}

解决方案 »

  1.   

    映射文件如下:T_Order.hbm.xml<?xml version="1.0" encoding="utf-8"?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="dbo">
      <class name="WareHouse.Entities.T_Order, WareHouse.Entities" table="T_OrderHead">
        <id name="Id" column="ID" type="System.String">
          <generator class="WareHouse.Logic.IdHelper,WareHouse.Logic"/>
        </id>
        <bag name="DetailList" inverse="true" lazy="true" table="T_OrderDetail">
          <key column="OrderID"/>
          <one-to-many class="WareHouse.Entities.T_OrderDetail, WareHouse.Entities"/>
        </bag>
      </class>
    </hibernate-mapping>
    T_OrderDetail.hbm.xml<?xml version="1.0" encoding="utf-8"?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="dbo">
      <class name="WareHouse.Entities.T_OrderDetail, WareHouse.Entities" table="T_OrderDetail">
        <id name="Id" column="ID" type="System.String" unsaved-value="null">
          <generator class="WareHouse.Logic.IdHelper,WareHouse.Logic"/>
        </id>
        <many-to-one name="Order" class="WareHouse.Entities.T_Order, WareHouse.Entities">
          <column name="OrderID" length="25" sql-type="varchar" not-null="false"/>
        </many-to-one>
      </class>
    </hibernate-mapping>
    高手们救命啊~~~
      

  2.   

     tx.Commit();
    这句打断点看一下是否执行到这里了。还有不存不了报错了没有啊?
      

  3.   

    我来帮你解决,你单步看下具体的异常信息.会不会是因为你的Session是全局的,第一次保存不成功的时候,你的对象还存在在Session里面.
    再保存的时候所以不成功.在异常后.是不是可以把对象从Session中脱离.  Session.Evict(order)
      

  4.   

    用Evict还是不行,错误描述是no collection snapshot for orphan delete
      

  5.   

    现在只要在T_Order.hbm.xml的bag中加入cascade="all-delete-orphan",就会报no collection snapshot for orphan delete这个错。
    如果改为cascade="all"保存又没问题,但不能级联删除。
      

  6.   

     public class T_Order 
        {
            protected string _id;
            protected IList _orderDetail = new ArrayList();        virtual public string Id
            {
                get { return _id; }
                set { _id = value; }
            }        virtual public IList DetailList
            {
                get
                {
                   
                    return _orderDetail;
                }
                set { _orderDetail = value; }
            }    }
      

  7.   

    http://jira.nhibernate.org/browse/NH-1177