2011-06-26 8 views
1

nHibernateに関するかなり簡単な質問がありますが、実際にはGoogleで答えを見つけることができませんでした。親からnhibernateオブジェクトの更新されたコレクションを取得する簡単な質問

たとえば、Mailオブジェクトに1:nの外部キーを保持する、マップされたMemberオブジェクトがあるとします。私は彼が自分の受信トレイに入ったときにユーザーのメールアイテムの現在のコレクションを取得したいと思います。 memberInstance.Mail(タイプIList < \ Mail>)を呼び出すと、メールコレクションは戻されますが、ログイン時にmemberInstanceがキャッシュに保存されてから追加された新しいメールは反映されません。データベース。 RetrieveMailForUserメソッドを作成した場合は、メンバーインスタンスを渡してからSession.CreateCriteria<Mail>などのコードを呼び出します。指定されたメンバーおよびすべての現在のメールを取得しますが、使用しない場合はメンバー変数にメールコレクションを持たないようです最新のものではないメンバーvarにコレクションがあるとします。ユーザーが受信トレイを確認してキャッシュに保存するたびにメンバーを更新することができましたが、これはオーバーヘッドが大きいようです。私はnHibernateのいくつかの基本的なプリンシパルが欠けているような気がします。助けてください。ありがとう!

メンバーを呼び出すコード:

 public static Member GetLoggedInUser() 
     { 
      var member = (Member) HttpContext.Current.Session[SESSION_NAME]; 

      if(member != null && 
!NHibernateSessionManager.IsEntityAttachedToCurrentSession(member)) 
       NHibernateSessionManager.AttachEntityToSession(member); 
      return member; 


     } 

E

+1

あなたは、コレクションの変更がキャッシュされたアイテムに反映されていないと言います。私はあなたの問題がそこにあると信じています。オブジェクトに加えた変更は、キャッシュからそのアイテムを再取得したときに反映されるべきです(SHOULD)。 Memberオブジェクトを初期化して永続化する方法に関するさらに詳しい情報を提供できますか? –

+0

申し訳ありませんが、キャッシュではなくASPネットセッションに保存されています。ユーザーを取得するコードでオリジナルの質問を編集しました。 – Eitan

答えて

1

あなたのポストから私は2つの相反する要件を導き出す:

  1. あなたがキャッシュ内にオブジェクト(メンバー)欲しい、これデータベース内で何が起こるかによって更新されるべきではありません。キャッシュの性質上、自動的に何かをリロードしたり、キャッシュしようとしたりしません。

  2. メンバーオブジェクトのメールコレクション内のメールは、アクセスされるたびに更新されるため、最初にメンバーオブジェクトを取得した時点でキャッシュ内にあったものは無視します。あなたが最初のアプローチに固執したい場合は、新しいメールアドレス(member.AddMail(メール)またはそのような何かを呼び出す)、そのオブジェクトのために作成されるたびに、あなたが直接キャッシュ内のメンバーオブジェクトを更新する必要があります

。私はそれが実現可能かどうかは分かりません。なぜなら、あなたは明らかにメンバーをセッションに保持しており、それは別のセッションのメンバーオブジェクトにアクセスする必要があるからです。

メールの最新のリストが必要な場合は、メールリストを明示的に再読み込みしたり、オブジェクト全体を再読み込みしたり、上記の方法でメールを読み込んだりする方法はありません既に(RetrieveMailForUser)です。その場合、メンバーオブジェクトのメールコレクションを確実に削除できます。コレクションが必要ない場合は、コレクションをマップする必要はありません。

+0

答えとして回答をマークしましたが、まだいくつか質問があります。まずクラスをマッピングするためにオートマッペを使用します。安全に持ち出すことはできないと思いますが、どう思いますか?第二に、メールリストを明示的に再読み込みする方法、nhibernate関数があるか、それを再投入するために 'RetrieveMailForUser'を呼び出すのですか?答えをありがとうbtw – Eitan

+0

私はautomapperに精通していませんが、Memberクラスのメールコレクションを削除しようとしましたか?リロードの場合、あなたのケースでは 'RetrieveMailForUser'を呼び出すだけで私のためにうまくいくようです。 – bonifaz

関連する問題