【问题标题】:NHibernate - Only persist changes when a save/update call is madeNHibernate - 仅在进行保存/更新调用时保留更改
【发布时间】: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


【解决方案1】:

NHibernate 会话就是这样设计的。

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

【讨论】:

  • 难道没有办法通过玩弄flushmode来实现这一点吗?
  • 是的,您可以将其设置为Never,它只会显式刷新。但这是一个全有或全无的命题:您不能选择性地刷新某些实体。
  • 你的第二条评论是对我的回答。
  • @Alistair:实际上,我应该挂起我的答案。最新版本的 NHibernate 在会话和查询中引入了SetReadOnly 方法,它可以防止更新该实体/实体组。
猜你喜欢
  • 2019-03-12
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
  • 2023-03-18
相关资源
最近更新 更多