如何强制Nhibernate事务失败?
问题描述:
如何强制Nhibernate事务失败(来自调用代码),以便我可以确保失败的行为正常工作?如何强制Nhibernate事务失败?
我无法修改源代码,我只是需要让它失败!
例如:当你在该行调试立即停止查询执行之前将开始和关闭数据库,然后让代码运行
public void DoSomething(/*Some parameters*/){
using (var tx = _session.BeginTransaction())
{
try
{
//Do something
tx.Commit();
}
catch (Exception)
{
if (tx != null) tx.Rollback();
throw;
}
} }
答
如果有异常发生tx.Commit内(),然后可能插入/更新无效数据的记录(例如,对于数据库c来说太长的字符串olumn)。
答
一个想法是。不过,我认为有一个更好,更具编程性的方式来测试它。
答
抛出异常。
答
设置一些全局变量(我知道人们有全局变量,但这是一个很好的用法)事务内部代码读取,如果它看到变量集抛出异常。
答
抛出一个异常:
using(var sess = sf.OpenSession())
using(var tx = sess.BeginTransaction())
throw new Exception();
关闭连接:
using(var sess = sf.OpenSession())
using(var tx = sess.BeginTransaction())
sess.Connection.Close();
回滚事务:
using(var sess = sf.OpenSession())
using(var tx = sess.BeginTransaction())
tx.Rollback();
答
您可以编写单元测试来验证代码的预期行为。
答
一种方式来做到这一点是:
[Test]
public void VerifyExceptionIsThrown()
{
Assert.Throws<NHibernate.HibernateException>(
() =>
{
using (var tx = _session.BeginTransaction())
{
_session.Update(new Entity());
tx.Commit();
}
});
}
尝试更新一个短暂的实体将引发exeption。
或者,如果您使用NHibernateValidator,您可以显式地失败您设置的验证,假设实体的Name属性不应超过10个字符。 如果使用长度超过10个字符的字符串填充实体的Name属性,并尝试保存它,则tx.Commit()会引发异常。
举例可能吗? – 2009-11-30 19:53:01
抛出新的Exception(); – epitka 2009-11-30 20:12:35
你是认真的吗?请阅读这个问题...... – 2009-12-01 00:09:24