为这样一个菜鸟问题道歉。
我有两个实体:父母和孩子,因此建模:
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时缺少一些基本的东西。
感谢您的帮助
答案 0 :(得分:2)
解决了这个问题,并且应该在第一个代码示例中包含更多细节。
在同一会话中保存父级(使用级联)后,我尝试检索父级的子对象。
关闭会话并尝试上述任何一个查询都会返回子(ren)。