2010-11-05 28 views
16

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

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

但我还是不知道做这样:

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

会按照我希望它的工作方式工作

它会工作吗?如果不是,我还能做什么?

回答

23

Evict刷新后可能无法正常工作。

理论上,Refresh就应该足够了。然而,当儿童收藏的元素被删除时,它已经有了一些已知的问题。

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

+0

抱歉这样说,但这并不工作:(它的工作原理在这种情况下: 1)pEntity.pCollection是空 2)我在数据库中手动 3)我可以看到更新的集合 项目添加到收藏 但并不在这种情况下工作: 1)pEntity.pColelction具有提神我仍然有pEntity相同的项目后的值 2)我手动更改数据库 3 pEntity.pCollection项的值) .pCollection ... – Katalonis 2010-11-08 09:56:42

+1

如果** pCollection级联,单独刷新应该在该场景中工作。否则,您也必须手动刷新其项目。 – 2010-11-08 10:36:24

+0

单独刷新似乎对我来说已经足够用于添加和删除实体上的懒惰集合。如果有特殊情况我应该知道,链接到任何已知的问题或警告将有所帮助。 – 2011-08-04 02:02:58

2

刷新(parentObject)将是一个不错的选择,但对我而言,它首先获取所有的孩子一个接一个请求。没有批处理,没有子查询,没有加入。很坏!

它帮助.Clear()父对象的子集合;我之前也驱逐了这些儿童物品。

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

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

原因是对ParentID和Index(连续数字)具有唯一约束的子集合,这会在更新已更改的子项目时导致唯一性违规。因此,该指数首先增加1000000(或任意高的数字)所有的孩子,然后在变化后,再次减少。

相关问题