NHibernate ThenFetchMany正在检索重复的子代。

| 我有一个父对象,其子集合包含一个元素,子集合包含一个“ grandchild”集合,其中包含3个元素。 我正在使用NHibernate从数据库加载父对象,如下所示
Parent parentObject = session.Query<Parent>()
    .FetchMany(x => x.Children)
    .ThenFetchMany(x => x.GrandChildren)
    .Where(x => x.Id = \"someparentid\")
    .Single();
我发现,当父对象只有一个时,会有重复的子对象(总共3个)附加到父对象。 (每个孩子正确地附加了3个孙对象。)急于加载childs集合只能正常工作。 您知道我如何在没有重复子对象的情况下实现完整父对象的加载吗?     
已邀请:
        如果按设置映射“儿童”和“孙子代”,则可以避免使用笛卡尔积。您需要将“子孙”定义为集合:
public class Parent
{
    ...
    public virtual ICollection<Child> Children { get; set; }
    ...
}

public class Child
{
    ...
    public virtual ICollection<GrandChild> GrandChildren { get; set; }
    ...
}
并在映射中(使用FluentNHibernate):
public class ParentMapping : ClassMap<Parent>
{
    public ParentMapping()
    {
        ...
        HasMany(x => x.Children)
            .KeyColumn(\"ParentID\")
            .Inverse
            .AsSet()
        ...
    }
}

public class ChildMapping : ClassMap<Child>
{
    public ChildMapping()
    {
        ...
        HasMany(x => x.GrandChildren)
            .KeyColumn(\"ChildID\")
            .Inverse
            .AsSet()
        ...
    }
}
    
        我可以使用QueryOver在这里使用答案,它可以在生成有效SQL的同时正确加载对象(每个表选择而不是一个巨大的联接)。     
        因为您的结果是笛卡尔积,所以您不能使用NHibernate来做到这一点(我也不认为您也可以使用EF4来做到这一点)。您将从所有表中获得所有结果。 NHibernate不知道如何将两个集合的结果映射回根。因此,对于每个孩子,您将获得相同数量的GrandChildren,对于每个GrandChildren,您将最终获得相同数量的Child。     
        如果您使用的是Linq,则可以使用以下方法简化它:
int parentId = 1;
var p1 = session.Query<Parent>().Where(x => x.ParentId == parentId);

p1
.FetchMany(x => x.Children)
.ToFuture();

sess.Query<Child>()
.Where(x => x.Parent.ParentId == parentId);
.FetchMany(x => x.GrandChildren)
.ToFuture();

Parent p = p1.ToFuture().Single();
此处的详细说明:http://www.ienablemuch.com/2012/08/solving-nhibernate-thenfetchmany.html     

要回复问题请先登录注册