NHibernate Eager使用Queryover API加载复杂的对象图

tom*_*ich 7 nhibernate queryover

我有一个非常复杂的对象图,我想一举加载.

样本具有Daylog,其具有Daylog测试,其具有Daylog结果

Daylog测试具有Testkeys,Daylog结果具有Resultkeys,TestKeys具有Resultkeys.

我正在使用QueryOver API和Future将这些全部作为一个查询运行,NHibernate应该需要实例化整个图形IS所需的所有数据,并由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;
                }
Run Code Online (Sandbox Code Playgroud)

但是,我仍然最终使用代理来表示Testkey和ResultKey之间的关系,即使我特意加载了这种关系.

我认为整个查询可能代表对QueryOver API的理解不足,所以我想要任何和所有建议,但主要是,我想了解为什么我得到一个代理而不是后面的结果列表我试着得到daylogresult.resultkey.testkey.results.

有帮助吗?

tom*_*ich 5

答案是在各种对象上调用NHibernateUtil.Initialize.简单地拉下数据并不意味着NHibernate会为所有代理提供水分.