nHibernate没有冒泡错误

时间:2013-02-04 14:01:44

标签: c# sql-server nhibernate

我确信这是有效的,现在已经停止了,我无法理解为什么。我的课程太复杂了,不能发表,但我做了一个简单的课程来测试,但它仍在发生。

我创建了一个类“abc”,它有一些在数据库中不为null的属性。我创建了一个类的实例,并故意将属性保留为null,以便它将引发错误。在输出窗口中,错误显示为

  

类型'System.Data.SqlClient.SqlException'的第一次机会异常   发生在System.Data.dll类型的第一次机会异常   NHibernate.DLL

中发生了'NHibernate.Exceptions.GenericADOException'

但是异常并没有冒充我的代码而且没有任何问题。该行不在数据库中,如果我从SQL事件探查器复制SQL,我会得到正确的错误“无法将null插入列......”

问题是我在一个事务中创建了几个对象,如果一个失败,我希望抛出一个错误,以便我可以回滚所有,但由于错误没有冒泡,我无法捕获它们,所以我不能回滚。

以下不是代码,而是为了证明我的意思:

using (NHibernate.ITransaction tx = Session.BeginTransaction())
{
    try
    {
        // Should Fail
        ABC a1 = new ABC();
        a1.prop1 = "1234";
        Session.SaveOrUpdate(a1);

        // Should Save
        ABC a2 = new ABC();
        a2.prop1 = "1234";
        a2.prop2 = "1234";
        Session.SaveOrUpdate(a2);

        // Should Fail
        ABC a3 = new ABC();
        Session.SaveOrUpdate(a3);

        tx.Commit()

    }
    catch (Exception ex)
    {
        tx.Rollback()
        throw ex;
    }
}

在上面的对象a1a3中,当插入失败时,应抛出错误(并在输出窗口中看到),但它不会被catch {}捕获声明,它只是一步一步,所以tx.commit运行,a2持久存储到数据库(shouldn't发生)。

任何想法? TY。

1 个答案:

答案 0 :(得分:0)

尝试在事务提交后调用Session.Close()

延迟加载和NHibernate缓存有时会有奇怪的行为。