预先加载的孩子和儿童的孩子集合在NHibernate的(Eager loading child an

2019-08-03 07:48发布

我有一个问题,NHibernate的尝试加载数据的一小层次。 我的域模型是这样的:

class GrandParent
{
    int ID{get;set;}
    IList<Parent> Parents {get; set;}
}

class Parent
{
    IList<Child> Children {get; set;}
}

class Child
{
}

我想急于加载所有家长和孩子对于给定的祖父母。 这LINQ到NH查询创建正确的SQL并加载按预期的方式祖父母:(例子假定祖父母有2个父母谁各有2个孩子的对象 - 所以4孩子全部对象)。

var linq = session.Linq<GrandParent>();
linq.Expand("Parents");
linq.Expand("Parents.Children");
linq.QueryOptions.RegisterCustomAction(c => 
    c.SetResultTransformer(new DistinctRootEntityResultTransformer()));
var grandparent = (select g from session.Linq<GrandParent>()
                   where g.ID == 1
                   select g).ToList();

Assert(grandparent.Count == 1); //Works
Assert(grandparent.Parents.Count == 2); //Fails - count = 4!

该grandparent.Parents集合包含4个项目,其中2个是重复的。 看来DistinctRootEntityResultTransformer仅适用于集合1级深,所以父母收集被复制取决于许多小孩如何对象,每个家长都有。

是否有可能获得NH仅包括不同的父对象?

非常感谢。

Answer 1:

如果您的映射设置为FetchType.Join,尝试将其更改为FetchType.Select。



文章来源: Eager loading child and child-of-child collections in NHibernate