NHibernate Eager Loading с Queryover API на сложном графе объектов

У меня есть довольно сложный граф объектов, который я хочу загрузить одним махом.

В образцах есть дневные журналы, в которых есть тесты дневного журнала, у которых есть результаты дневного журнала.

У тестов Daylog есть Testkeys, у результатов Daylog есть Resultkeys, а у TestKeys есть Resultkeys.

Я использую QueryOver API и Future, чтобы запускать все это как один запрос, и все данные, которые должны понадобиться NHibernate для создания экземпляра всего графа, возвращаются, проверенные NHProf.

                public static IList<Daylog> DatablockLoad(Isession sess,
ICollection<int> ids)
                {
                        var daylogQuery = sess.QueryOver<Daylog>()
                                .WhereRestrictionOn(dl => dl.DaylogID).IsIn(ids.ToArray())
                                .Fetch(dl => dl.Tests).Eager
                                .TransformUsing(Transformers.DistinctRootEntity)
                                .Future<Daylog>();

                        sess.QueryOver<DaylogTest>()
                                .WhereRestrictionOn(dlt =>
dlt.Daylog.DaylogID).IsIn(ids.ToArray())
                                .Fetch(dlt => dlt.Results).Eager
                                .Inner.JoinQueryOver<TestKey>(dlt => dlt.TestKey)
                                .Fetch(dlt => dlt.TestKey).Eager
                                .Inner.JoinQueryOver<ResultKey>(tk => tk.Results)
                                .Fetch(dlt => dlt.TestKey.Results).Eager
                                .Future<DaylogTest>();

                        sess.QueryOver<DaylogResult>()
                                .Inner.JoinQueryOver(dlr => dlr.DaylogTest)
                                .WhereRestrictionOn(dlt =>
dlt.Daylog.DaylogID).IsIn(ids.ToArray())
                                .Fetch(dlr => dlr.ResultKey).Eager
                                .Fetch(dlr => dlr.History).Eager
                                .Future<DaylogResult>();

                        var daylogs = daylogQuery.ToList();

                        return daylogs;
                }

Тем не менее, я все еще получаю прокси для представления отношений между Testkey и ResultKey, хотя я специально загружаю эти отношения.

Я думаю, что весь этот запрос, вероятно, свидетельствует о плохом понимании API QueryOver, поэтому мне хотелось бы получить любые советы по нему, но в первую очередь я хотел бы понять, почему я получаю прокси, а не список результатов, когда позже Я пытаюсь получить daylogresult.resultkey.testkey.results.

Любая помощь?


person tom.dietrich    schedule 20.05.2011    source источник


Ответы (2)


Ответ заключался в том, чтобы вызвать NHibernateUtil.Initialize для различных объектов. Простое извлечение данных не означает, что NHibernate будет гидратировать все прокси.

person tom.dietrich    schedule 07.07.2011

Чтобы избавиться от прокси, вам нужно загрузить все свои сущности в одно предложение QueryOver. Но в этом случае у вас будет много объединений в вашем запросе, поэтому я рекомендую использовать ленивую загрузку с пакетной обработкой.

person xelibrion    schedule 21.05.2011