NHibernate:修改两个会话中实体的不同字段

时间:2011-04-11 20:26:12

标签: nhibernate fluent-nhibernate

我有一个包含多个字段的实体。可以对其执行两种类型的动作:通常由用户发起的长动作,以及由系统周期性地运行的短动作。这两个都更新了实体,但它们触及不同的领域。

不能有两个并发长操作或两个并发短操作。但是系统可以在长操作进行时调度短操作,并且两者应该同时执行。由于它们触及不同的领域,我相信这应该是可能的。

我认为NHibernate的变更跟踪应该在这里做 - 即,如果一个会话加载一个实体并更新一些字段,另一个会话加载同一个实体并更新不同的字段,那么这两个不会发生碰撞。但是,我觉得我不应该依赖它,因为它听起来像是“优化”或“实现细节”。我倾向于将变更跟踪视为优化以减少数据库流量,我不希望系统的功能依赖于它。此外,如果我决定为这个实体实现乐观并发,那么我冒险获得StaleObjectException,即使我可以保证没有实际的冲突。

实现这一目标的最佳方法是什么?我应该将实体分成两部分吗?这不会影响数据库的一致性(例如,如果实体中只有一个“半”,那么该怎么办?)我可以使用NHibernate显式设置实体的单个字段吗?我不想依靠变更跟踪来实现功能吗?

如果重要,我正在使用Fluent NHibernate。

1 个答案:

答案 0 :(得分:2)

您可以使用dynamic update映射实体。

  • dynamic-update(可选,默认为false):指定应在运行时生成UPDATE SQL,并且仅包含值已更改的列。

如果启用动态更新,您可以选择乐观锁定策略:

  • version检查版本/时间戳列
  • all检查所有列
  • dirty检查更改的列
  • none不使用乐观锁定

更多信息here

相关问题