2010-11-05 31 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(或任意高的數字)所有的孩子,然後在變化後,再次減少。

相關問題