私のアプリケーションの多くは、データを取得するために準拠したクエリを使用しています。これらのクエリでは、現在のユーザーをよく参照します。私は、ユーザーBが別のユーザーAの後にログインすると、ユーザーBにユーザーAの情報が表示されることに気付いています。コンパイル済みクエリキャッシュを実行しますか?
私はすべてを通して
public static Func<DataContext, MyRecord> CurrentUserRecords =
CompiledQuery.Compile<DataContext, MyRecord>(
(DataContext db) =>
(from r in db.MyRecords
where
r.User == User.Current
select r).SingleOrDefault());
User.Current
はログインしています誰に依存して変化する静的プロパティであるアプリケーションから、このような多くのクエリを持っている。
public static User Current
{
get { return MyBase<User>.Get((int)(HttpContext.Current.Session["CurrentUserID"] ?? 0)); }
}
私が初めてでのログイン
ユーザーA、上記のコンパイルされたクエリはユーザーAのレコードを返します。 User.CurrentがユーザーAに適切な参照を返すことになります。ただし、User.CurrentがUser Bへの参照を返しているにもかかわらず、ユーザーBとしてログインすると、上記のコンパイルされたクエリはユーザーAのレコードを返します。ProfilerをSQL Server用に実行し、コンパイル済みのクエリが生成されたTSQLを参照してユーザーAのIDを参照しているときに気付きました。
だから私の質問はこれです:
は、クエリが何らかの形でキャッシュコンパイルのですか?
もしそうなら、寿命はいくらですか?私はそれを制御できますか?
ASP.netアプリケーションのコンパイルされたクエリの不適切なデザインで「現在のユーザー」を参照していますか?
ありがとうございます!
私はそれを恐れていました。私は現在、CompliledQuery.compileのオーバーロードが使用できるパラメータの量を最大限に活用しています。私はこれを見つけましたhttp://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/f1fc5570-be6d-4d7f-b94f-aa5b6e9922cf/ –
あなたはFuncを使用する必要があります。 Funcの利用可能なパラメータのすべては、すべてのパラメータを表すオブジェクトを作成し、それを入力としてFuncに渡します。 – BZink