Большая часть моего приложения использует собранные запросы для получения данных. В этих запросах я буду часто ссылаться на текущего пользователя. Я замечаю, что если пользователь 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. Однако, когда я вхожу в систему как пользователь B, вышеуказанный скомпилированный запрос по-прежнему возвращает записи пользователя A, несмотря на то, что User.Current возвращает ссылку на пользователя B.
Я запустил Profiler для SQL Server и заметил, что, когда скомпилированный запрос был выполнен, оба раза сгенерированный TSQL ссылался на идентификатор пользователя A.
Так что мой вопрос таков:
Скомпилированные запросы как-то кэшируются?
Если да, то какова продолжительность жизни, и могу ли я контролировать ее?
Является ли ссылка на «текущего пользователя» в скомпилированном запросе плохим дизайном для приложения ASP.net?
Спасибо всем!