2012-01-05 12 views
6

で正しくキャッシュされている、NHibernateのは、クエリが同じであるとき、変数の値を更新クエリプランをキャッシュしません。期待LINQの投影は、以下のような単純な投影を考えるとNHibernateは3.2

int argValue = 1; 
    var result1 = database.Users.Select(x => new {x.Name, BadArg = argValue}).First(); 

    argValue = 2; 
    var result2 = database.Users.Select(x => new {x.Name, BadArg = argValue}).First(); 

結果1値の名前= "ボブ" であろうとBadArg = 1つの

結果2値NAME = "ボブ" とBadArg = 2

あろう

実際

結果1値は、Name = "ボブ" とBadArg = 1つの

結果2値は、明らかにこれは多くを引き起こす可能性があります名前= "ボブ" とBadArg = 1

だろうだろうあなたがそれを期待していないならば、狂った行動の。私はNHibernateはのバグ追跡にこれに類似couple bug reportsを見てきましたが、昨年5月以来、その上に任意のアクションがなかったです。誰もLinqを使ってNhibernateを大いに使っていないか、私が知らないいくつかの回避策があります。

私はNHibernateはソースに掘る前に、この動作を防止するためのクエリプランのキャッシュまたは他のいくつかの回避策を無効にする方法があるか、誰が、上記のリンクからパッチを適用していますか?

例は実際に、私は途中で動作しませんIEnumerableをへの変換、私はIQueryableをとして維持したい複雑な突起部を持って、簡単な質問を保つためのものです。

更新 は、あなたが完全にキャッシュを回避したい場合は、このようにコードを変更してみてくださいNHibernateは3.2.1

+0

私は好奇心から、このに見てきた、それは問題が適切にNHibernateのキャッシュではありませんように、それはLINQの式ツリーキャッシュだ見えます。問題は、式ツリーが単純化され、変数参照が定数式に還元された後にキャッシュキーが構築されることです。しかし、その時点ではスコープ変数refと定数の間に違いがないことがあります。 : -/ – Rytmis

+0

私もこの問題を抱えてきました。数ヶ月ごとにそれが作物をバックアップし、私はそれを忘れてしまって、それを再発見するだけです。私の場合は、匿名のオブジェクトに投影するのではなく、自分自身のオブジェクトを評価することになります。 –

答えて

0

ためのGitHubのマスターでは動作しません:

int argValue = 1; 
var result1 = database.Users.AsEnumerable().Select(x => new {x.Name, BadArg = argValue}).First(); 

argValue = 2; 
var result2 = database.Users.AsEnumerable().Select(x => new {x.Name, BadArg = argValue}).First(); 

何が起こるかということですNHLinq Selectメソッドを使用する代わりに、System.Linq Selectメソッドを使用すると、NHibernateが投影をキャッシュするのを効果的に防止できます。もちろん、欠点は、あなたがメモリ内の投影をやるということですので、あなたは、すべてのユーザーテーブルのフィールドの代わりに、あなたが望むものだけを選択してしまいます。ここで

+0

私はそれがうまくいくことを知っていますが、その種別を少し敗北させます。私の例は質問のために単純にしていましたが、現実にはIQueryableとして保持したいと思います。 –

0

が第1レベルのキャッシュを無効にする方法は次のとおりです http://darioquintana.com.ar/blogging/2007/10/08/statelesssession-nhibernate-without-first-level-cache/

を私はあなたが二次キャッシュを無効にすることができるとは思わないが、私はあなたがこの問題のために持っていないと思います。

(基本的には、各クエリのセッションを作成し、破壊する必要があります。)

あなたは問題ががまだ永続的である見つけた場合、あなたはRytmisが提案何を行う必要があるでしょう。

+0

良い提案! :-) – Rytmis

+0

クエリを実行するために別のセッションを作成するのは少し重いようですが、別のセッションのオブジェクトに悪影響を及ぼす可能性があります。 –

+0

あなたが投影しているものに依存します - 投影にスカラー値しか含まれていない場合は、問題ではありません。しかし、あなたは正しい、それは正しいとは思わない。 – Rytmis