我想刷新一个实体及其所有子集合。做这个的最好方式是什么?我在谈论nhibernate:)
我读过有关session.Evict,session.Refresh ...
的文章但我仍然不确定是否喜欢:
RefreshEntity<T>(T entity)
{
session.Evict(entity);
session.Refresh(entity);
}
将完全按照我希望的方式工作
它会起作用吗?如果不是我还能做什么?
答案 0 :(得分:25)
在Evict之后刷新可能不起作用。
理论上,Refresh
就足够了。但是,当已删除子集合的元素时,已知问题。
Evict
后跟Get
通常会完成任务。
答案 1 :(得分:3)
刷新(parentObject)将是一个不错的选择,但对我来说,它首先使用单个请求逐个获取所有子项。没有批处理,没有子查询,没有加入。非常糟糕!
它帮助.Clear()父对象的子集合;我之前也驱逐过子对象。
(在父/子SaveOrUpdate多次插入会导致昂贵的聚簇索引重建之前,HQL更新已经更改了这些更新。)
编辑:我再次删除了HQL更新,因为查询(按唯一的大数字递减索引)比批量中的数百个单行更新更昂贵。所以我最终得到了一个简单的SaveOrUpdate(parentObject),无需刷新。
原因是子集合对ParentID和Index(序列号)具有唯一约束,这会在更新已更改的子项时导致唯一性违规。因此,对于所有子项,索引首先递增1000000(或任意高数),然后在更改后再次递减。