在nhibernate中刷新实体的最佳方法是什么?

时间:2010-11-05 14:02:11

标签: nhibernate session nhibernate-mapping refresh

我想刷新一个实体及其所有子集合。做这个的最好方式是什么?我在谈论nhibernate:)

我读过有关session.Evict,session.Refresh ...

的文章

但我仍然不确定是否喜欢:

RefreshEntity<T>(T entity)
{
 session.Evict(entity);
 session.Refresh(entity);
}

将完全按照我希望的方式工作

它会起作用吗?如果不是我还能做什么?

2 个答案:

答案 0 :(得分:25)

在Evict之后刷新可能不起作用。

理论上Refresh就足够了。但是,当已删除子集合的元素时,已知问题。

Evict后跟Get通常会完成任务。

答案 1 :(得分:3)

刷新(parentObject)将是一个不错的选择,但对我来说,它首先使用单个请求逐个获取所有子项。没有批处理,没有子查询,没有加入。非常糟糕!

它帮助.Clear()父对象的子集合;我之前也驱逐过子对象。

(在父/子SaveOrUpdate多次插入会导致昂贵的聚簇索引重建之前,HQL更新已经更改了这些更新。)

编辑:我再次删除了HQL更新,因为查询(按唯一的大数字递减索引)比批量中的数百个单行更新更昂贵。所以我最终得到了一个简单的SaveOrUpdate(parentObject),无需刷新。

原因是子集合对ParentID和Index(序列号)具有唯一约束,这会在更新已更改的子项时导致唯一性违规。因此,对于所有子项,索引首先递增1000000(或任意高数),然后在更改后再次递减。