Проблема кеша 2-го уровня с запросом соединения - PullRequest
3 голосов
/ 06 сентября 2011

Я хочу использовать кэш второго уровня для моего запроса с активной загрузкой (запрос написан ниже тремя разными способами, я использую кеш запросов).У меня стандартная ассоциация один ко многим.Я установил кеш сущности для родителя, потомка и ассоциации между родителем и классом.И кэш 2-го уровня не работает, потому что у меня есть исключения.

Я написал свой запрос 3 разными способами:Критерии:

 session.CreateCriteria<DictionaryMaster>().SetFetchMode("DictionaryItems", FetchMode.Eager)
                .SetResultTransformer(new DistinctRootEntityResultTransformer())
                .SetCacheable(true).SetCacheMode(CacheMode.Normal)
                    .List<DictionaryMaster>().ToList();

Когда я вызвал этот запрос, я получил исключение «Невозможно выполнить поиск [SQL: SQL недоступен]». Я думаю, что проблема существует, потому что я использую преобразование DistinctRootEntityResultTransformer.Я начну создавать свой собственный класс преобразования, и я надеюсь, что это сработает.

Запрос окончен:

 session.QueryOver<DictionaryMaster>().Fetch(x => x.DictionaryItems).Eager
                    .TransformUsing(new DistinctRootEntityResultTransformer())
                    .Cacheable().CacheMode(CacheMode.Normal)
                    .List<DictionaryMaster>().ToList();

Исключение такое же, как и в критериях.

Linq:

session.Query<DictionaryMaster>().Fetch(x => x.DictionaryItems).Cacheable().CacheMode(CacheMode.Normal).ToList();

Здесь ошибка зависит от версии nhibernate в 3.1.ошибка https://nhibernate.jira.com/browse/NH-2587?page=com.atlassian.jira.plugin.system.issuetabpanels%3Achangehistory-tabpanel но в версии 3.2 я получил это: https://nhibernate.jira.com/browse/NH-2856

Заранее спасибо

1 Ответ

2 голосов
/ 07 сентября 2011

sJHony Я нашел решение, но для меня это больше похоже на обходной путь. Поэтому, если вы знаете любое другое решение, дайте мне знак.
Я использую QueryOver без каких-либо преобразований , вина этого решения заключается в том, что запрос возвращает элементы, равные количеству дочерних элементов. Далее я получаю не умноженный список в памяти, используя отчетливый.
Это решение хорошо, но когда мы добавляем еще один Fetch для запроса, то коллекция в объекте также увеличивается, поэтому я изменил тип коллекции с IList (Bag) на ISet (Set).


Код выглядит так:

var queryCacheResult =
                session.QueryOver<DictionaryMaster>()
                .Fetch(x => x.DictionaryItems).Eager
                    .Cacheable().CacheMode(CacheMode.Normal)
                    .List<DictionaryMaster>().ToList();

            return queryCacheResult.Distinct(new KeyEqualityComparer<DictionaryMaster>(x => x.Code)).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...