如何在nhibernate中急切加载子集合

时间:2014-05-29 18:58:44

标签: c# nhibernate fluent-nhibernate

为这样一个菜鸟问题道歉。

我有两个实体:父母和孩子,因此建模:

public class Parent()
{
 public virtual int ID{ get; protected set; },
 public virtual IList<child> Children {get;set;}
}

public class Child()
{
 public virtual int ID{ get; protected set; },
 public virtual Parent Parent {get;set;}
}

使用这些映射:

public class ParentMap : ClassMap<Parent>
{
 public ParentMap()
 {
 Id(x => x.Id).GeneratedBy.Identity(); 
 HasMany(x=>x.Children)
 .Cascade
 .AllDeleteOrphan()
 .Inverse();
 }
}

public class ChildMap : ClassMap<Child>
{
 public ChildMap()
 {
  Id(x => x.Id).GeneratedBy.Identity(); 
  References(x=>x.Parent)
  .Cascade
  .SaveUpdate();
 }
}

我已经开始延迟加载了,因为父母可以有很多孩子而且我不想总是加载孩子。

我尝试过以下方法:

var query1 = Session.QueryOver<Parent>()
.Where(x => x.Id == parent.Id)
.Fetch(t=>t.Children).Eager().List<Parent>();

var query2 = Session.CreateCriteria<Parent>("d")
            .Add(Restrictions.Eq("Id", parent.Id))
            .SetFetchMode("d.Children", FetchMode.Eager)
            .List<Parent>();

var query3 = Session.CreateCriteria(typeof (Parent))
            .Add(Restrictions.Eq("Id", parent.Id))
            .SetFetchMode("Children", FetchMode.Eager)
            .List<Parent>();

当然,我已经简化了对象,但我也在他们自己的控制台应用程序中尝试过这些,只是为了测试。问题是:在这些查询中,我实际上都没有孩子。

查看SQL事件探查器,我看不到任何由nhibernate生成的连接。 我知道我可以走另一条路,从孩子那里得到父母,但我宁愿不这样做。

我认为我在理解Nhibernate时缺少一些基本的东西。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

解决了这个问题,并且应该在第一个代码示例中包含更多细节。

在同一会话中保存父级(使用级联)后,我尝试检索父级的子对象。

关闭会话并尝试上述任何一个查询都会返回子(ren)。