Я пытаюсь использовать кэш второго уровня для поиска объектов, потому что их всего несколько, и эти объекты следует менять только в исключительных случаях.
Если я получаю эти объекты с помощью ICriteria, то эти объекты помещаются в кэш второго уровня, однако, если я получаю их через ISQLQuery (функция-табличное значение), тогда эти объекты не кэшируются. Вызов .SetCacheable (true) и т. Д. Не имеет никакого эффекта.
Итак, кэширование второго уровня с ISQLQuery не поддерживается или мне не хватает некоторых настроек?
Edit:
Пример - первый запрос во всем приложении после перезапуска IIS:
var query = _session.CreateSQLQuery("SELECT {foo.*} fro dbo.foo_GetList()");
query.AddEntity("foo", typeof(Foo));
query.SetCacheable(true);
query.List<Foo>();
Когда запускается приведенный выше код, я не вижу ничего добавленного в кеш (например, нет NHibernate.Caches.SysCache.SysCache - добавление новых данных в журнал NHibernate). Последующие вызовы, такие как _session.Get (id), делают новый выбор. Если я заменю следующее на
var criteria = _session.CreateCriteria<Foo>();
criteria.List<Foo>();
тогда сущности кэшируются.
Кроме того, мне кажется, что при использовании возвращаемых объектов ISQLQuery не следует выбирать зависимые объекты из кэша, а выбирать их заново.