如何强制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)。

一个想法是。不过,我认为有一个更好,更具编程性的方式来测试它。

抛出异常。

+0

举例可能吗? – 2009-11-30 19:53:01

+3

抛出新的Exception(); – epitka 2009-11-30 20:12:35

+0

你是认真的吗?请阅读这个问题...... – 2009-12-01 00:09:24

设置一些全局变量(我知道人们有全局变量,但这是一个很好的用法)事务内部代码读取,如果它看到变量集抛出异常。

抛出一个异常:

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()会引发异常。