NHibernate-仅在进行保存/更新调用时保留更改

NHibernate-仅在进行保存/更新调用时保留更改,nhibernate,Nhibernate,NHibernate自动保存对对象所做的任何更改,无论您在提交事务时是否进行session.save/update调用。例如 session.BeginTransaction(); User user = repos.getUser("tony"); user.Age = 34 transaction.Commit(); 年龄更新。当您想从数据库中获取一个对象并在不保存这些更改的情况下进行一些更改时,这可能会很烦人。您可以将session.execute对象逐出,但随后将失去加载代理的能

NHibernate自动保存对对象所做的任何更改,无论您在提交事务时是否进行session.save/update调用。例如

session.BeginTransaction();

User user = repos.getUser("tony");

user.Age = 34

transaction.Commit();
年龄更新。当您想从数据库中获取一个对象并在不保存这些更改的情况下进行一些更改时,这可能会很烦人。您可以将session.execute对象逐出,但随后将失去加载代理的能力

有没有办法让NHibernate在进行保存/更新调用时只保留更改

更新:

谢谢你的回复,没有人告诉我怎么做(而且可能不可能),所以我不回答

您应该将所有db调用包装在一个事务中,并提交该事务以关闭它

我之所以这样做,是因为我对结果进行了复杂的排序,而这实际上是通过SQL/NHibernate无法实现的。不幸的是,NHibernate假设我想将这个新订单保存回DB

我的解决方法是在我的事务属性[transaction(onlyread=true)]中添加一个属性,这会导致它使用FlushMode.Never


我想在未来的工作中,我只会确保做出我想坚持的改变。遗憾的是,没有只在显式调用时才保存的选项。

这就是NHibernate会话的工作原理


如果您希望手动执行所有操作,请改用
IStatelessSession
。您将失去缓存、延迟加载等功能。

如果将transaction.commit放在user.Age=34之前,会发生什么情况?好吧,您不必打开事务…为什么要对实体进行更改而不保留它们?也许答案在于改变设计而不是NHibernate的工作方式。@g这样您就可以在模型上执行“如果”样式的场景,而无需持续更改。是否也可以通过玩弄flushmode来实现这一点?是的,您可以将其设置为
从不
,并且它只会显式刷新。但这是一个要么全有,要么全无的命题:你不能有选择地刷新某些实体。你的第二个评论为我提供了答案。@Alistair:事实上,我应该更改我的答案。NHibernate的最新版本在会话和查询中引入了
SetReadOnly
方法,从而防止更新该实体/实体组。