渴望在NHibernate中加载儿童和儿童收藏品

时间:2009-09-01 14:27:40

标签: c# nhibernate eager-loading linq-to-nhibernate

我遇到NHibernate试图加载一小块数据的问题。我的域名模型如下:

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

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

class Child
{
}

我希望为给定的GrandParent加载所有父母和孩子。此Linq-to-NH查询创建正确的SQL并按预期加载GrandParent :(该示例假定祖父母有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级的集合,因此根据每个父级具有的子对象的数量,可以复制Parents集合。

是否可以让NH只包含不同的Parent对象?

非常感谢。

1 个答案:

答案 0 :(得分:1)

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