Пакеты, которые я использую:
NHibernate 5.2.1
NHibernate.Caches.SysCache 5.5.1
Конфигурация NH кеша:
<configuration>
<configSections>
<section name="syscache" type="NHibernate.Caches.SysCache.SysCacheSectionHandler,NHibernate.Caches.SysCache" />
</configSections>
<syscache>
<!-- 3.600s = 1h; priority 3 == normal cost of expiration -->
<cache region="GeoLocation" expiration="3600" sliding="true" priority="3" />
</syscache>
</configuration>
Я хочу запросить несколько мест, используя их уникальные первичные ключи. В этом модульном тесте я имитирую два запроса, используя разные сеансы, но одну и ту же фабрику сеансов:
[TestMethod]
public void UnitTest()
{
var sessionProvider = GetSessionProvider();
using (var session = sessionProvider.GetSession())
{
var locations = session
.QueryOver<GeoLocation>().Where(x => x.LocationId.IsIn(new[] {147643, 39020, 172262}))
.Cacheable()
.CacheRegion("GeoLocation")
.List();
Assert.AreEqual(3, locations.Count);
}
Thread.Sleep(1000);
using (var session = sessionProvider.GetSession())
{
var locations = session
.QueryOver<GeoLocation>().Where(x => x.LocationId.IsIn(new[] { 39020, 172262 }))
.Cacheable()
.CacheRegion("GeoLocation")
.List();
Assert.AreEqual(2, locations.Count);
}
}
Если идентичные идентификаторы запрашиваются в том же порядке, второй вызов извлечет объекты из кэша. В этом примере, однако, запрос вызывается только с двумя из ранее представленных идентификаторов. Хотя местоположения были кэшированы, второй запрос извлечет их из БД.
Я ожидал, что кеш будет работать как таблица, которая запрашивается первой. Только идентификаторы, которые еще не были кэшированы, должны вызывать вызов БД. Но очевидно, что весь запрос является хеш-ключом для кэшированных объектов.
Есть ли способ изменить это поведение?