Кэшированная выборка для ролей пользователей из NHibernate в приложении MVC
Используя классы как это...
public class Login
{
public virtual Guid LoginId { get; set; }
public virtual string Name { get; set; }
public virtual string Email { get; set; }
public virtual IList<Group> Groups { get; set; }
}
public class Group
{
public virtual Guid GroupId { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
public virtual IList<Role> Roles { get; set; }
public virtual IList<Login> Logins { get; set; }
}
public class Role : ITerminable
{
public virtual Guid RoleId { get; set; }
public virtual string DisplayName { get; set; }
public virtual string RoleName { get; set; }
public virtual string Description { get; set; }
}
И ERD, который выглядит так...
Это мой текущий запрос.
var login = loginRepository.Query().Where(x => x.Name == username).FetchMany(x=>x.Groups).ThenFetchMany(x=>x.Roles).SingleOrDefault();
return login.Groups.SelectMany(x => x.Roles).Distinct().ToList();
Проблема в том, что, хотя первый запрос к моему сайту всегда в порядке и выполняется как один запрос для ролей текущего пользователя, последующие запросы приводят к тому, что NHibernate Profiler показывает множество кэшированных запросов (по одному для каждой роли). Я не совсем уверен, является ли это красным флагом или нет (я использую SysCache2, но в настоящее время он не использует зависимости от базы данных). Но я хотел бы попытаться найти способ очистить его.
Есть ли способ исправить это, чтобы я не получал попадание в кэш для каждой роли в каждом запросе, когда первый запрос был только одним попаданием в базу данных? Или, как аналогия, я неправильно истолковываю конденсацию на трубе как утечку?
1 ответ
Кеш сущностей отделен от кеша запросов.
В кеше запросов хранятся только идентификаторы, полученные в результате выполнения запроса, поэтому для извлечения сущностей требуется получить этот список, а затем получить все значения из кеша сущностей.