При определении вычисляемого свойства с использованием формулы в 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) является надуманным и никогда не должен происходить на практике).
И, если есть последствия для кеширования, как я подозреваю, какие альтернативы могут существовать для аналогичного варианта использования, чтобы избежать потенциальных проблем?