Я просто провожу несколько экспериментов с Castle AR и кешем 2-го уровня NH.В следующих двух методах я вижу, что кэширование работает нормально, но только для повторения вызова каждого из них.Другими словами, если я вызываю RetrieveByPrimaryKey
дважды для одного и того же ПК, объект находится в кеше.И если я вызываю RetrieveAll
дважды, я вижу, что SQL выдается только один раз.
Но если я вызываю RetrieveAll
, а затем RetrieveByPrimaryKey
с некоторым PK, я вижу, как выдаются два оператора SQL.У меня вопрос: почему AR не ищет эту сущность в кеше?Конечно, он нашел бы его там в результате предыдущего вызова RetrieveAll
.
public static T RetrieveByPrimaryKey(Guid id)
{
var res = default(T);
var findCriteria = DetachedCriteria.For<T>().SetCacheable(true);
var eqExpression = NHibernate.Criterion.Expression.Eq("Id", id);
findCriteria.Add(eqExpression);
var items = FindAll(findCriteria);
if (items != null && items.Length > 0)
res = items[0];
return res;
}
public static T[] RetrieveAll()
{
var findCriteria = DetachedCriteria.For<T>().SetCacheable(true);
var res = FindAll(findCriteria);
return res;
}