4

ContentPageのコレクションを持つ 2 つのオブジェクト -がありChildLinksます。

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 をデータベースとして使用しています。

前もって感謝します!

4

1 に答える 1

2

私は同じ問題を抱えていましたが、次の記事で問題を解決できました。

逆マップ コレクションと NHibernate の 2 次キャッシュ

基本的に、コレクションをinverseとしてマップした場合、子アイテムを削除するときに、親コレクションからも明示的に削除する必要があります。そうしないと、子を削除した後にキャッシュの状態が無効になります。最初に確認することは、関係が本当に逆である必要があるかどうかです。

逆が必要または望ましいと仮定し、例を使用します。

次のようなものだけではなく:

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);
于 2012-03-01T07:51:10.580 に答える