我有一个非常复杂的对象图,我想一次加载 俯冲。
示例包含日志,其日志测试具有Daylog 结果
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之间,即使我是专门加载的 这种关系。
我认为整个查询可能代表了穷人 了解QueryOver API,所以我想要任何和所有的建议 在它上面,但主要是,我想了解为什么我得到代理而不是 稍后我试图得到的结果列表 daylogresult.resultkey.testkey.results。
有任何帮助吗?
答案 0 :(得分:5)
答案是在各种对象上调用NHibernateUtil.Initialize。简单地拉下数据并不意味着NHibernate会为所有代理提供水分。
答案 1 :(得分:0)
您必须在一个QueryOver子句中加载所有实体才能删除代理。但在这种情况下,您的查询中会有很多连接,所以我建议使用延迟加载和批处理。