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

时间:2013-04-25 19:41:30

标签: 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 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 ...... Data Model 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 个答案:

答案 0 :(得分:0)

实体缓存与查询缓存分开。

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