You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Session.Update后Session.CreateSqlQuery未读取更新值的问题求助

事务内混合使用Session.Update()与原生SQL更新的代码示例

下面是一段在同一事务中,先更新实体状态,再执行原生SQL复杂更新的代码片段,场景是移除Person关联的相关引用:

private void RemoveReferences(Person obj) 
{ 
    // Session为ISession类型
    // Person包含多个Activity,每个Activity可包含多个DetailedActivity
    using (var tx = Session.BeginTransaction()) 
    { 
        foreach (var act in obj.Activities) 
        { 
            var det = Session.QueryOver<DetailedActivity>() 
                .Where(w => w.ActivityId == act.Id)
                .List();
            
            // 通过Session.Update更新实体状态
            foreach (var d in det)
            {
                d.IsDeleted = true;
                Session.Update(d);
            }
            
            // 紧接着执行原生SQL的复杂更新查询
            Session.CreateSqlQuery(@"
                UPDATE OtherRelatedTable 
                SET Status = 'Inactive' 
                WHERE DetailedActivityId IN (SELECT Id FROM DetailedActivity WHERE ActivityId = :activityId)")
                .SetParameter("activityId", act.Id)
                .ExecuteUpdate();
        }
        
        tx.Commit();
    }
}

关键注意事项

  • 事务范围必须覆盖所有操作,避免部分执行导致的数据不一致问题
  • 使用QueryOver查询实体时,若关联数据较多,建议提前通过Fetch加载关联内容,避免N+1查询性能问题
  • 原生SQL执行更新后,若后续还要查询相关实体,记得调用Session.Refresh()或者清空一级缓存,防止读取到未同步的脏数据

内容的提问来源于stack exchange,提问作者Nicke Manarin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:14:36