我确定这是有效的,现在已经停止,我不知道为什么。我的课程太复杂而无法发布,但我制作了一个简单的课程来测试它仍在发生。
我创建了一个类“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;
}
}
在上面的对象中a1
,a3
当插入失败时应该抛出错误(并在输出窗口中看到),但它不会被catch {}
语句捕获,它只是逐步执行并因此tx.commit
运行并a2
持久化到数据库(shouldn't
发生这种情况)。
有任何想法吗?泰。