1

我确定这是有效的,现在已经停止,我不知道为什么。我的课程太复杂而无法发布,但我制作了一个简单的课程来测试它仍在发生。

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

System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的第一次机会异常 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发生这种情况)。

有任何想法吗?泰。

4

1 回答 1

0

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

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

于 2013-02-04T15:01:29.373 回答