admin

NHibernate不仅保存一个属性

sql

我正在尝试更新表中的单个列。不会发出任何UPDATE(使用SQL Profiler检查)。没有错误。

  • 类映射有dynamic-update="true"
  • 该课程未启用任何版本控制。
  • 刷新模式提交。
  • 没有任何插入/更新修饰符(<property name="Deleted" />)的属性映射。
  • 属性是自动实现的(public virtual bool Deleted { get;set;})。
  • NH 3.3.0,.NET 4,x64。
    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;
    }
    }


阅读 172

收藏
2021-06-07

共1个答案

admin

根据注释,您要尝试做的是创建一个代理,而无需从DB获取当前状态(使用session.Load),然后发出动态更新。

这是行不通的。NHibernate不会记录对属性的单独更改;相反,它:

  • 将被跟踪实体的当前状态与从数据库中检索到的属性值的快照进行比较。
  • 基于此,确定哪些实体是脏的(即具有更改)
  • 它生成SQL更新语句。如果使用dynamic-update,它将仅包含修改后的属性。

如果使用session.Load,则在访问Deleted属性后,NH将从数据库中加载记录。在已跟踪的实体上使用session.Load还是session.Getsession.Update都是禁止操作。

或者,如果您已经拥有所有订单属性的状态,则可以不加载而进行更新:

var order = GetTheOrderFromMemory();
order.Deleted = true;
session.Update(order);
transaction.Commit();

不会 尊重dynamic-update,因为NH没有快照可以与…进行比较。

…这就是为什么HQL是对单个属性进行一次性更新的唯一方法的原因。

2021-06-07