2011-09-09 19 views
3

ContentPageという2つのオブジェクトがあります。コレクションはChildLinksです。キャッシュされたコレクションがNhibernateによって無効にされていない

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

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

ContentPage.ChildLinksプロパティは第2レベルのキャッシュを使用します。私はFluent NHを使用してNhibernateを構成し、Nhibernate 3.1を使用しています。キャッシュは、コレクションと 'ChildLink'クラスの両方に対して「読み取り - 書き込み」として設定されます。

私はChildLinkを削除するたびにコレクションキャッシュが無効化されていないことに気付きました。私はContentPage.ChildLinksを呼び出すときにこのように、私はエラーを取得する:

no row with the given identifier exists 

私はキャッシュをオフにしてきた、それがうまく動作します。キャッシュを自動的に無効にしてはいけませんか?キャッシュプロバイダとしてSysCache、データベースとしてMySQLを使用しています。

ありがとうございます!

Inverse Mapped Collections and NHibernate's Second-Level Cache

を基本的に、あなたはまた、あなたが子アイテムを削除すると、としてあなたのコレクションをマッピングした場合:私は同じ問題を抱えていたと私は私の問題を解決し、次の資料を越えでき

+0

このカールの詳細については、あなたができました:子オブジェクトを削除するときに

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; } } 

とを。 2番目のレベルのキャッシュを持つFNHを見て(AppFabricに)。 –

答えて

2

親コレクションから明示的に削除する必要があります。そうしないと、子を削除してもキャッシュ状態が無効になります。関係を本当に逆にする必要があるかどうかをまず確認します。逆を想定し

は必要ですかを希望し、あなたの例を使用して:

代わりのようなだけで何かを:あなたがしなければならない

Session.Delete(ChildLink); 

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

またかもしれませんこの時点でContentPageオブジェクトを明示的に保存する必要がある場合は、セッションのフラッシュ設定によって異なります。

私は、例えば逆の関係を管理するための私のエンティティのメソッドを使用します。

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

私はこれを調べ、それについてあなたに戻ってきますが、それは興味深いようです。来週、私は海外に行くでしょう! –

関連する問題