【发布时间】:2010-11-16 03:30:00
【问题描述】:
NHibernate 自动保存对对象所做的任何更改,无论您在提交事务时是否进行 session.save/update 调用。例如。
session.BeginTransaction();
User user = repos.getUser("tony");
user.Age = 34
transaction.Commit();
年龄已更新。当您想从数据库中获取对象并进行一些更改而不保存这些更改时,这可能会很烦人。您可以 session.evict 对象,但随后您将失去加载代理的能力。
有没有办法让 NHibernate 仅在进行保存/更新调用时才保留更改?
更新:
感谢您的回复,没有人告诉我该怎么做(这可能是不可能的),所以我将不予回答。
您应该将所有数据库调用包装在一个事务中并提交该事务以关闭它。
我这样做是因为我对结果进行了复杂的排序,而这实际上无法通过 SQL/NHibernate 实现。不幸的是,NHibernate 假设我想将这个新订单保存回数据库。
我的解决方法是向我的事务属性 [Transaction(onlyread = true)] 添加一个属性,使其使用 FlushMode.Never
我认为对于未来的工作,我会确保只进行我想要坚持的更改。可惜没有选项仅在您明确调用时才保存。
【问题讨论】:
-
如果您将 transaction.commit 放在 user.Age=34 之前会发生什么?
-
好吧,您不必打开交易...
-
为什么要对实体进行更改而不是持久化它们?也许答案在于改变设计而不是改变 NHibernate 的工作方式。
-
@g 这样您就可以在您的模型上执行“假设”样式的场景,而无需保留更改。
标签: nhibernate