NHibernate - 为什么Delete()调用无法删除但通过HQL删除有效?

时间:2009-11-04 21:13:07

标签: nhibernate transactions db2 ibm-midrange

考虑到以下代码块,为什么调用HQL工作但调用delete()不起作用?作为背景,我使用NHibernate而不是IBM.Data.DB2.Iseries驱动程序。来发现,AS400上的日志已经关闭,所以我无法使用交易。我不是AS400管理员或者对它有任何了解所以我不知道是否关闭了日记功能(不打开事务)是否导致了这个问题。如果我正在调用Delete()或其他NHibernate函数,我是否绝对需要能够打开事务?

//This Does not work - no error and no deletes
public static void Delete(Object Entity)
    {
        using (ISession session = _sessionFactory.OpenSession())
        {
            //using(ITransaction tx = session.BeginTransaction())
            //{
                session.Delete(Entity);
                //tx.Commit();                    
                session.Close();                    
            //}
        }
    }

//This does work
public static void Delete(Object Entity)
    {
        using (ISession session = _sessionFactory.OpenSession())
        {
            //commented out transaction control because throws error because
            //journaling is not turned on the AS400
            //using(ITransaction tx = session.BeginTransaction())
            //{
                session.CreateQuery("delete MyDAO p where p.MyDAOID = :MyDAOID").SetString("MyDAOID", ((MyDAO)Entity).MyDAOID.ToString()).ExecuteUpdate();                
            //}
        }
    }

2 个答案:

答案 0 :(得分:6)

删除后尝试调用session.Flush(),但在关闭会话之前。而且您不需要明确关闭会话:

using (var session = ...)
{
    entity.Delete();
    session.Flush();
}

答案 1 :(得分:1)

在深入研究之后,我发现这有效但为什么?:

public static void Delete(Object Entity)
{
    using (ISession session = _sessionFactory.OpenSession())
    {       
         MyDAO p = session.Get<MyDAO>(Entity.ID);
         session.Delete(p);
         session.Flush();                                    
    }            
}

这是我的场景:我之前已查询过填充到Grid中的对象列表。对于该查询过程,我打开/关闭了一个会话。在调用我的删除函数时,我将该对象传递给此函数以进行单独的打开/关闭会话过程。为了解决这个问题,我添加了对这个新删除的调用,要求它先获取对象(我要删除的对象),然后调用delete。现在它将删除查询发送到数据库,实际上删除了该对象。为什么是这样?

这是因为我的原始对象查询是在另一个会话中打开然后在另一个会话中删除的吗?这与工作单元有什么关系吗?我应该打开我的网格会话,保持打开状态,直到我的表单关闭,以便所有删除工作在该会话内?我的印象是应该快速打开/关闭会话。我很困惑。