如何强制Nhibernate事务失败(来自调用代码),这样我可以确保失败的行为正常工作?
我无法修改源代码,只需要让它失败!
示例:
public void DoSomething(/*Some parameters*/){
using (var tx = _session.BeginTransaction())
{
try
{
//Do something
tx.Commit();
}
catch (Exception)
{
if (tx != null) tx.Rollback();
throw;
}
} }
答案 0 :(得分:3)
抛出异常。
答案 1 :(得分:2)
抛出异常:
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();
答案 2 :(得分:1)
如果必须在tx.Commit()中发生异常,则可能插入/更新包含无效数据的记录(例如,对于db列来说太长的字符串)。
答案 3 :(得分:0)
一个想法是,当您在查询执行开始之前调试停止时,关闭数据库然后让代码运行。但是我认为有一种更好,更程序化的方法来测试它。
答案 4 :(得分:0)
设置一些全局变量(我知道人们有全局变量,但这是一个很好的用法),事务内部代码读取,如果它看到变量集抛出异常。
答案 5 :(得分:0)
您可以编写单元测试来验证代码的预期行为。
答案 6 :(得分:0)
一种方法是:
[Test]
public void VerifyExceptionIsThrown()
{
Assert.Throws<NHibernate.HibernateException>(
() =>
{
using (var tx = _session.BeginTransaction())
{
_session.Update(new Entity());
tx.Commit();
}
});
}
尝试更新瞬态实体会抛出一个异常。
或者,如果您使用NHibernateValidator,您可以明确地失败您设置的验证,比如实体的Name属性不应超过10个字符。 如果使用长度超过10个字符的字符串填充实体的Name属性并尝试保存它,则tx.Commit()将引发异常。