Что делает кэширование запросов (SetCacheable(true)
), это сохраняет идентификаторы , полученные по запросу; затем он гидратирует объекты один за другим (возможно, из кэша сущностей).
IIRC, при кэшировании запроса FetchModes для связанных объектов не используются, поэтому ссылки автора не инициализируются.
Стоит отметить, что вы не должны использовать свои сущности вне сеанса, но вот обходной путь:
news = session.CreateCriteria(typeof(NewsItem))
.SetCacheable(true)
.SetFetchMode("Author", FetchMode.Eager)
.List<NewsItem>();
foreach (var item in news)
{
var name = item.Author.Name;
}
Это приведет к инициализации прокси внутри сессий; таким образом вы сможете использовать их потом.
Конечно, вам необходимо убедиться, что и NewsItem, и Author кэшированы, иначе вы на самом деле уменьшите производительность, кэшируя запрос.