我正在尝试更新表中的单个列。不会发出任何UPDATE(使用SQL Profiler检查)。没有错误。
dynamic-update="true"
<property name="Deleted" />
public virtual bool Deleted { get;set;}
using (var transaction = this._session.BeginTransaction())
{ try { var order = this.session.Load(id); order.Deleted = true; this._session.Update(order); transaction.Commit(); } catch (Exception) { transaction.Rollback(); throw; } }
根据注释,您要尝试做的是创建一个代理,而无需从DB获取当前状态(使用session.Load),然后发出动态更新。
session.Load
这是行不通的。NHibernate不会记录对属性的单独更改;相反,它:
dynamic-update
如果使用session.Load,则在访问Deleted属性后,NH将从数据库中加载记录。在已跟踪的实体上使用session.Load还是session.Get,session.Update都是禁止操作。
Deleted
session.Get
session.Update
或者,如果您已经拥有所有订单属性的状态,则可以不加载而进行更新:
var order = GetTheOrderFromMemory(); order.Deleted = true; session.Update(order); transaction.Commit();
这 不会 尊重dynamic-update,因为NH没有快照可以与…进行比较。
…这就是为什么HQL是对单个属性进行一次性更新的唯一方法的原因。