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 natruei 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?

questionAnswers(1)

yourAnswerToTheQuestion