我如何强制Nhibernate事务失败?

时间:2009-11-30 18:48:40

标签: 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;
    }
} }

7 个答案:

答案 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()将引发异常。