【问题标题】:Eager loading child and child-of-child collections in NHibernate在 NHibernate 中急切地加载子集合和子集合
【发布时间】:2010-11-24 16:04:17
【问题描述】:

我在 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 级深度的集合,因此 Parent 集合的复制取决于每个父对象有多少子对象。

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

非常感谢。

【问题讨论】:

  • 你能解决这个问题吗?真的很烦。
  • 是的 - 请参阅下面关于更改 IList 为 ICollection 并在映射中使用“设置”的评论。

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


【解决方案1】:

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

【讨论】:

  • 感谢 mxmissile,然后就可以了,尽管您无法在 Linq-to-NH 中指定获取类型(除非我遗漏了某些内容),而且我不想一直使用它,所以我不愿意修改映射。另一个解决方法是将 IList 集合更改为 ICollection 并在映射中使用“set”而不是“bag”。我还一起破解了一个 ResultTransformer 来处理这个问题,一旦我达到合理的标准,我会在此处提供一个链接。
  • @Simon,您可以在映射中指定默认获取类型
猜你喜欢
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 2018-11-06
  • 1970-01-01
  • 2023-03-24
  • 2011-06-24
相关资源
最近更新 更多