Wpływ na buforowanie NHibernate dla wyszukiwań z wynikami, w tym obliczoną wartością odwzorowaną jako formuła (np. Ranga)
Podczas definiowania obliczonej właściwości przy użyciu formuły w NHibernate, jakie są implikacje, kiedy formuła zmienia swój wynik w zależności od ograniczeń kwerendy, zwłaszcza w odniesieniu do buforowania zapytań?
Dokładniej, rozważmy następującą prostą klasę 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; }
}
Mapowane za pomocą następującego prostego mapowania 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>
Działa z fabryką sesji zhibernate.cache.use_query_cache
opcja ustawiona natrue
i zapytałem w następujący sposób:
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);
Czy NHibernate zachowa się w rozsądny sposób dla zwróconych podmiotów? Czy może wartość „Rank” z jednego zapytania z pamięci podręcznej może spowodować zanieczyszczenie wartości Rank innego zapytania z powodu pamięci podręcznej zapytań? Czy są jakieś inne obawy, kiedy używa się takiej formuły w mapowaniach NHibernate?
EDYTOWAĆ:
Warto również zauważyć, że w moim szczególnym przypadku „Entity” nie jest podmiotem biznesowym pierwszej klasy, lecz rodzajem metapodmiotu. Odwzorowuje on indeksowany widok bazy danych na inne jednostki pierwszej klasy i jest używany wyłącznie do wyszukiwania (wywołanie session.Load (id) jest wymyślone i nigdy nie powinno się zdarzyć w praktyce).
A jeśli tak, tosą implikacje dla buforowania, jak podejrzewam, jakie alternatywy mogą istnieć dla podobnego przypadku użycia, aby uniknąć potencjalnych problemów?