2017-05-29 18 views
0

Fluent NHibernateのキャッシュに問題があります。たとえばIDなどのクエリで無効にしたいとします。流暢NHibernateキャッシュを無効にする

session.Get<Person>(10); 

ご意見はありますか?

+1

もう少し問題があると説明できたらうれしいです。 –

+0

実際のトラブルに間違った解決策を適用する方法を尋ねているかもしれません。 –

答えて

1

あなたは第一レベル(セッション)のキャッシュを参照していますか?
はあなたが最新の情報に更新を使用して、データベースからのエンティティの状態をリフレッシュすることができ、それは次のようになります。あなたは既に実体を保持する場合は、もう一度それを取得するのではなく、その上に直接session.Refresh(person)を呼び出す

// Will get the state from the first-level cache if already present in the session: 
var entity = Session.Get<EntityType>(entityId); 

// Line below will update the entity with the current state from the database: 
Session.Refresh(entity); 
+0

エンティティがキャッシュにまだ存在しない場合、データベースに対して2つのクエリが発生します。 –

+0

それは本当です。上記のような状況(リフレッシュしたいエンティティへの参照がない場合)を回避するには、Session.LoadをSession.Getの代わりに使用することができます。 –

1

また、これ以上のセッションでもないし、これ以上のいずれかの変更を追跡し、それを引き起こし、session.Evict(person)でそれを立ち退かせることがあります。その後、それを破棄し、必要に応じて後で再度取得します。

それ以外の場合、これはトラブルがセッションキャッシュからそれを得ている考慮することは珍しいです。これは、多くのユーザーインタラクション(アンチパターン)で同じセッションを使用するなど、悪いセッション使用の兆候であることがよくあります。

あなたはまだ何Fredy proposesを行うことができます。または、セッションキャッシュをクリアする(そして途中ですべての保留中の変更を失う)前に、session.Clear()に電話してください。