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
相关产品推荐
相关产品推荐

