禁止在事务之外更改对象

时间:2012-03-22 11:12:37

标签: nhibernate transactions

我们最近偶然发现了NHibernate的行为让我们感到非常头疼;)。

让我们看看下面的例子:

declare x
open transaction
  create and persist object x
commit transaction

change object x

open other transaction
  do nothing
close transaction

令我们惊讶的是,对第二个事务之外的'x'所做的更改提交到了数据库(尽管这种行为在我考虑之后对我来说也很有意义)。在我们的架构中,这有点问题,因此我们习惯于在我们来自世界的不同行为;)。

现在问题:

  1. 是否可以禁止NHibernate事务之外的对象更改(例如抛出异常)?
  2. 是否可以只提交实际在当前事务中进行的更改?
  3. 是否有一些完全不同的东西,我们可以做的是强制执行对持久对象的更改只在特定范围内进行(using-directive,class,namespace等)?
  4. 感谢你的学生,BaSche

2 个答案:

答案 0 :(得分:0)

对象x在事务之外没有更改,因为当您打开会话时,您创建的事务不是显式的。当您调用transaction.Commit()或关闭会话时,它已完成session.Flush(),并且您的所有更改都已保存。

答案 1 :(得分:0)

我会回答你的问题,不,不,不。当然一切皆有可能,例如你可以用INotifyPropertyChanged做一些丑陋的事情,如果没有交易则抛出异常。但是NHibernate不是按照你的意愿设计的。

NHibernate旨在让你的对象不知道持久层,并且它在这些中大部分都成功(有一些值得注意的例外,例如需要虚拟来进行延迟加载)。 NHibernate事务适用于将对象状态与数据库同步,而不是对对象本身进行更改。此外,如果事务中止且具有挑战性,您必须能够回滚对象的更改。