2011-09-09 49 views
3

我有兩個對象 - ContentPage,它有一個集合ChildLinks緩存集合沒有被Nhibernate無效

ContentPage 
----------- 
ID 
Title 

ChildLink 
---------- 
ID 
ParentPageID [ContentPage] 
ChildPageID [ContentPage] 
Priority 

ContentPage.ChildLinks屬性利用二級緩存。我使用Fluent NH來配置Nhibernate,並使用Nhibernate 3.1。 Cache對於集合和'ChildLink'類都設置爲'Read-Write'。

我注意到,每當我刪除ChildLink時,收集緩存不會失效。因此,當我叫ContentPage.ChildLinks,我得到一個錯誤:

no row with the given identifier exists 

我已經關閉緩存,它工作得很好。緩存不應該自動失效?我使用SysCache作爲緩存提供者,MySQL使用數據庫。

在此先感謝!

+0

是你能找到更多關於這個卡爾。使用二級緩存來看待FNH(對於AppFabric)。 –

回答

2

我有同樣的問題,我可以在下面的文章,其解決我的問題:如果您映射集合爲

Inverse Mapped Collections and NHibernate's Second-Level Cache

基本上,當你刪除的子項還必須確保將其從父集合中明確地刪除,否則刪除子項後緩存狀態將無效。首先要檢查的是這種關係是否真的需要相反。

假設逆是必要或需要,並使用你的例子:只有像

相反:

Session.Delete(ChildLink); 

你要做的:

ContentPage.ChildLinks.Remove(ChildLink); 
ChildLink.ParentPage = null; 
Session.Delete(ChildLink); 

您也可能還需要明確地保存您的ContentPage對象,這取決於您的會話刷新設置。

我用我的實體的方法來管理此類反向關係,例如:在刪除子對象時

public ChildLink 
{ 
    public ContentPage ParentPage {get;set;} 

    public void AddToPage(ContentPage addTo) 
    { 
     addTo.ChildLinks.Add(this); 
     this.ParentPage = addTo; 
    } 

    public void RemoveFromPage() 
    { 
     ParentPage.ChildLinks.Remove(this); 
     this.ParentPage = null; 
    } 

} 

然後:

ChildLink.RemoveFromPage(); 
Session.Delete(ChildLink); 
+0

我會仔細研究這件事,然後回到你身邊,但它看起來很有趣。下週我必須在下週訪問我,我會在國外! –