1

使用这样的类...

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...... 数据模型 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,但它目前没有使用数据库依赖项)。但我想尝试找到一种方法来清除它。

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

4

1 回答 1

0

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

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

于 2013-04-26T15:53:08.270 回答