NHibernate стремится к загрузке с помощью API-интерфейса управления запросами на сложном графе объектов

#nhibernate #queryover

#nhibernate #выполнение запроса

Вопрос:

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

В примерах есть дневники, в которых есть дневные тесты, в которых есть результаты дневного журнала

Тесты дневного журнала имеют Testkeys, результаты дневного журнала имеют 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, хотя я специально загружаю
эта взаимосвязь.

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

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

Ответ №1:

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

Ответ №2:

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