在MVC应用程序中从NHibernate缓存获取用户角色

在MVC应用程序中从NHibernate缓存获取用户角色,nhibernate,linq-to-nhibernate,fluent-nhibernate-mapping,syscache2,nhibernate-profiler,Nhibernate,Linq To Nhibernate,Fluent Nhibernate Mapping,Syscache2,Nhibernate Profiler,使用这样的类 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 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; }
}
问题是,虽然对我的站点的第一个请求总是很好,并且作为当前用户角色的单个查询通过,但后续的请求会导致NHibernate Profiler显示大量缓存查询(每个角色一个)。我不完全确定这是否是一个危险信号(我使用的是SysCache2,但目前它没有使用数据库依赖项)。但我想尝试找到一种方法来清除itup


有没有办法解决这个问题,这样当第一个请求只是一个数据库命中时,我就不会在每个请求上的每个角色都得到缓存命中?或者作为类比,我是否将管道上的冷凝误解为泄漏?

实体缓存与查询缓存是分开的


查询缓存只存储查询执行产生的ID,因此检索实体需要获取该列表,然后从实体缓存中获取所有值。

缓存命中通常是一件好事……绝对,我想我想知道我是否应该担心它在探查器中单独显示每个角色的缓存命中条目,而不是作为一个整体显示缓存查询的一个缓存命中条目?这让我有点厌倦了每次我想查看剩下的条目时都要在分析器中滚动150多个缓存命中。不,你不必担心。实体缓存与查询缓存分开,后者只缓存ID。Ok。这对我来说已经足够了。感谢您花时间解释这一点。如果你能快速回答这个问题,我会接受你的回答。
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();