Кэширование не работает для связанных объектов, если в файле отображения не указана отложенная загрузка - PullRequest
1 голос
/ 24 августа 2010

У меня проблема с получением связанных сущностей для кэширования, если они не указаны (Not.LazyLoad () в отображении).Если я создаю запрос в Criteria или Linq, основной объект кэшируется, но не связанные объекты.

IList<NewsItem> news;
using (var session = factory.OpenSession())
{
    Console.WriteLine("First Query");
    news = session.CreateCriteria(typeof(NewsItem))
        .SetCacheable(true)
        .SetFetchMode("Author", FetchMode.Eager) // associated entity eager loaded
        .List<NewsItem>();
}
foreach (var item in news)
{
    Console.WriteLine("Author: " + item.Author.Name); //works fine first time
}

using (var session = factory.OpenSession())
{
    Console.WriteLine("");
    Console.WriteLine("Second Query");
    news = session.CreateCriteria(typeof(NewsItem))
        .SetCacheable(true)
        .SetFetchMode("Author", FetchMode.Eager)
        .List<NewsItem>();
}
foreach (var item in news)
{
    Console.WriteLine("Author: " + item.Author.Name); //NHibernate.LazyInitializationException
}

Я хочу избежать необходимости загружать ассоциации через файлы сопоставления.Любой другой, имеющий подобную проблему.

Любые отзывы приветствуются.

1 Ответ

0 голосов
/ 24 августа 2010

Что делает кэширование запросов (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 кэшированы, иначе вы на самом деле уменьшите производительность, кэшируя запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...