我确信这是有效的,现在已经停止了,我无法理解为什么。我的课程太复杂了,不能发表,但我做了一个简单的课程来测试,但它仍在发生。
我创建了一个类“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;
}
}
在上面的对象a1
和a3
中,当插入失败时,应抛出错误(并在输出窗口中看到),但它不会被catch {}
捕获声明,它只是一步一步,所以tx.commit
运行,a2
持久存储到数据库(shouldn't
发生)。
任何想法? TY。
答案 0 :(得分:0)
尝试在事务提交后调用Session.Close()
。
延迟加载和NHibernate缓存有时会有奇怪的行为。