2010-11-16 51 views
4

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

session.BeginTransaction(); 

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

user.Age = 34 

transaction.Commit(); 

年龄得到更新。当您想要从数据库获取对象并进行一些更改而不保存这些更改时,这可能会很烦人。你可以session.evict对象,但是你失去了加载代理的能力。

有没有办法让NHibernate只保存更改如果保存/更新调用?

更新:

感谢回应,没有人告诉我该怎么做(和它可能不会是可能的),所以我要离开它无人接听。

你应该将所有数据库调用包装在一个事务中,并提交该事务来关闭它。

我这样做是因为有复杂的排序我做的结果是不可能通过SQL/NHibernate的。不幸的是,NHibernate假设我想将这个新订单保存回数据库。

我的解决方法是将属性添加到我的事务属性[交易(onlyread =真)],导致其使用FlushMode.Never

我想对于今后的工作,我将只是确保只更改该我想坚持下去。可惜没有选择只在你明确地调用它的时候保存。

+2

如果你把你的transaction.commit放在user.Age = 34之前会发生什么? – blindmeis 2010-11-16 07:43:27

+0

那么,您不必开立交易... – flq 2010-11-16 12:55:04

+0

您为什么要对实体进行更改而不坚持它们?也许答案在于改变设计,而不是NHibernate的工作方式。 – 2010-11-16 12:55:28

回答

3

这就是NHibernate会话如何设计工作。

如果您宁愿手动执行所有操作,请改为使用IStatelessSession。你会失去缓存,延迟加载等。

+0

有没有办法通过玩弄flushmode来实现这一点? – DanP 2010-11-17 00:26:01

+1

是的,你可以将它设置为'永不',它只会显式清除。但是这是一个无所谓的命题:你不能有选择地刷新一些实体。 – 2010-11-17 00:56:12

+0

你的第二个评论是为我回答了这个问题。 – Alistair 2011-04-13 05:31:13