我们最近偶然发现了NHibernate的行为让我们感到非常头疼;)。
让我们看看下面的例子:
declare x
open transaction
create and persist object x
commit transaction
change object x
open other transaction
do nothing
close transaction
令我们惊讶的是,对第二个事务之外的'x'所做的更改提交到了数据库(尽管这种行为在我考虑之后对我来说也很有意义)。在我们的架构中,这有点问题,因此我们习惯于在我们来自世界的不同行为;)。
现在问题:
感谢你的学生,BaSche
答案 0 :(得分:0)
对象x在事务之外没有更改,因为当您打开会话时,您创建的事务不是显式的。当您调用transaction.Commit()或关闭会话时,它已完成session.Flush(),并且您的所有更改都已保存。
答案 1 :(得分:0)
我会回答你的问题,不,不,不。当然一切皆有可能,例如你可以用INotifyPropertyChanged做一些丑陋的事情,如果没有交易则抛出异常。但是NHibernate不是按照你的意愿设计的。
NHibernate旨在让你的对象不知道持久层,并且它在这些中大部分都成功(有一些值得注意的例外,例如需要虚拟来进行延迟加载)。 NHibernate事务适用于将对象状态与数据库同步,而不是对对象本身进行更改。此外,如果事务中止且具有挑战性,您必须能够回滚对象的更改。