2012-11-12 22 views
6

これは尋ねられましたが、私はこの問題を解決できません。NHIbernateコレクションをリフレッシュする

コレクションを持つnhibernateオブジェクトがあるとします。

問題は、コレクション内のオブジェクトが別のユーザーによってデータベース内で更新された場合(手動でデータベースのテストを行うため)、コレクション値をnhibernateに更新する方法が見つからないようです。

私は、リフレッシュ、エビクト、読み込み中です...セッションを閉じて新しいセッションを作成するだけです。しかし、私はこの解決策に問題があることを発見し、nhibernateに「おい、コレクション内のアイテムをリフレッシュする」と言うことがどれほど難しいのでしょうか?

しかし、どうにか私はそれを働かせることができません。たくさん

+0

あなたは親や子を追い出していますか? –

+0

yesssssssssssss。セッション自体によってチャンスがあった場合にのみ動作します。別の方法でデータベースに変更が加えられていない場合 –

+0

第2レベルのキャッシュを使用していますか? – csanchez

答えて

1

おかげでこれは実際にはそうでない理由です、動作するようになっていません。

NHibernateはデフォルトでセッションレベルのキャッシュを使用して、読み取りとトラックの変更を最適化します。

セッションが有効範囲にあり、必要なときにのみ使用する必要があるため、データアクセスの周りに正しい作業単位を使用していないようです。

これがウェブアプリの一部である場合は、「リクエストごとのセッション」アプローチに従うことをお勧めします。

あなたは本当にこれが動作したい場合は、おそらくエンティティを立ち退かせることができ、それがセッションから子供、再フェッチ強制的に、これは厄介であると私は実際にそれをお勧めしませんと思います。

+0

私は不快感に同意します。しかし、NHは本当にクールで、その背後にいる男達は鋭く賢いです。私はこれが彼らが意図した方法ではないと思う。 –

+0

エンティティを抹消すると機能しません!それを試みた。それで、コレクションアイテムを1つずつ取り除く以外の選択肢はありません。あなたが言ったように不快です。それはデスクトップアプリケーションであり、一部のオブジェクトは長生きしています。 –

+0

デスクトップアプリケーションであっても、あなたの作業ユニットを解決する必要があります。キャッシュされたデータの場合は、オブジェクトをセッションから切断し、更新が必要なときにオブジェクトを再フェッチします。そうしないと、複数のクライアントが失効したデータに基づいて書き込み競合を起こします。 – DavidWhitney

0

退去しようとするのに苦労し、開閉セッションも考えました。フィルタされたgetを実行するのに十分なheadspaceがコード内にあるかのように見えます。つまり、親IDが親オブジェクトのものであるコレクション型のすべての項目を取得します。 NHをどのように扱っているかによって、リポジトリやDAOを拡張する必要があるかもしれませんが、他の人が言っているように、例がなければ具体的にするのは難しいです。要点は、親IDでフィルタリングされたそのタイプのクエリで子オブジェクトを取得することです。

あなたには、いくつかの他のプロセスによって作成されたすべての新規または変更されたオブジェクトを取得したいので、これは、新鮮な取得となり、その後、あなたはあなたの親オブジェクトにコレクションとしてそのコレクションを設定することができます。あなたがあなたのオブジェクトについて仮定し、必要に応じて保存または更新できるので、NHはこれを乗り越えるべきです。親オブジェクトを取得してからもう一度保存するまでに時間差が生じる可能性がある場合は、これを使用することができます。

このアプローチの問題は、一種のマージタイプの操作が必要であることです。プロセスで作成された新しいオブジェクトを追加して、コレクションが更新されたときに変更が失われないようにすることができます。あなたがまだ立ち往生していれば、これが助けてほしいと思っています。

+0

ありがとう!しかし、ボックスコレクションのクールなものをフィルタリングされたものに置き換えれば、NHの美しさと実用性を失うと思います。 –

0

SessionFactoryクラスにIDisposeインターフェイスを実装する必要があります。ただ、このような

public class YouSessionFactory : INHibernateSessionFactory, IDisposable 
{ 
    private ISessionFactory _sessionFactory; 

    //codes for initial _sessionFactory, for configuration,mapping or something else. 
    //balalalalalala 
    //.... 

    public ISessionFactory BuildSessionFactory() 
    { 
     return _sessionFactory; 
    } 

    public void Dispose() 
    { 
     if (!_sessionFactory.IsClosed || _sessionFactory != null) 
     { 
      _sessionFactory.Close(); 
      _sessionFactory.Dispose(); 
     } 
    } 
} 
関連する問題