在 NHibernate 中使用公式定义计算属性时,如果公式根据查询限制改变其结果,特别是在查询缓存方面,这意味着什么?
更具体地说,考虑以下简单的 C# 类:
public class Entity
{
public Entity() { }
public virtual int Id { get; protected set; }
public virtual string Key { get; protected set; }
public virtual string Value { get; protected set; }
public virtual int Rank { get; protected set; }
}
使用以下简单的 NHibernate 映射进行映射:
<class name="Entity" mutable="false">
<id name="Id">
<generator class="native">
</id>
<property name="Key"/>
<property name="Value"/>
<property name="Rank" formula="row_number() over(order by value)">
</class>
hibernate.cache.use_query_cache
使用选项设置为的会话工厂运行true
,并通过以下方式查询:
ICriteria criteria = session.CreateCriteria(typeof(Entity));
criteria.SetCacheable(true);
criteria.SetCacheRegion("SearchResults");
IList<Entity> queryResult1 = criteria.List<Entity>();
criteria = session.CreateCriteria(typeof(Entity));
criteria.SetCacheable(true);
criteria.SetCacheRegion("SearchResults");
criteria.Add(Restrictions.Like("Key", "a", MatchMode.Anywhere));
IList<Entity> queryResult2 = criteria.List<Entity>();
Entity directResult = session.Load<Entity>(id);
NHibernate 会以合理的方式处理返回的实体吗?或者,一个缓存查询的“Rank”值是否会由于查询缓存而污染另一个查询的 Rank 值?在 NHibernate 映射中使用这样的公式时还有其他问题吗?
编辑:
还可能值得注意的是,在我的特定情况下,“实体”不是一流的业务实体,而是一种元实体。它映射到其他一流实体的索引数据库视图,并专门用于搜索( session.Load(id) 调用是人为的,实际上不应实际发生)。
而且,如果对缓存有影响,我怀疑,类似的用例可能存在哪些替代方案来避免潜在问题?