4

典型的な NHibernate コンテキスト クラスを考えてみましょう。

public class SampleContext : NHibernateContext
{
    public SampleContext(ISession session)
        : base(session)
    { }

    public IQueryable<Person> People
    {
        get { return Session.Linq<Person>(); }
    }

    public Person GetPerson(int id)
    {
        get { return Session.Linq<Person>().SingleOrDefault(p => p.ID == id); }
    }
}

私の質問:

  • GetPerson メソッドを書き直してキャッシュを無視し、データベースから直接データを取得するにはどうすればよいでしょうか?
4

1 に答える 1

10

この問題にアプローチするには、いくつかの方法があります。

  1. Hibernate 担当者は、データベースから最新のデータを取得するために別のセッションを開く必要があると言うでしょう。彼らは、セッションの意図は、比較的短期間の作業単位に限定することであると指摘するでしょう。

  2. データベースから常に最新の状態を取得するためにメソッドSession.Refresh()内に呼び出しを入れるか、独自のメソッドを介してその機能を公開することができます。GetPerson()Refresh()

  3. Personまたは、オブジェクト自体のハンドルを持っている場合は、オブジェクトを再度ロードする前に、セッション キャッシュSession.Evict()を削除することもできます。Person

私の経験では、#2 と #3 の両方を試しましたが、最終的には常に #1 を行うためのリファクタリングに行き着きました。

于 2009-12-14T20:26:09.053 に答える