7

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

样本有日日志,日日志测试有日日志结果

Daylog 测试有 Testkeys,Daylog Results 有 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.testkey.results。

有什么帮助吗?

4

2 回答 2

5

答案是在各种对象上调用 NHibernateUtil.Initialize。简单地将数据拉下来并不意味着 NHibernate 将水合所有代理。

于 2011-07-07T16:43:44.100 回答
0

您必须在一个 QueryOver 子句中加载所有实体才能摆脱代理。但是在这种情况下,您的查询中会有很多连接,所以我建议使用延迟加载和批处理。

于 2011-05-21T08:35:27.123 回答