我有以下查询:
ObjectB objectBAlias = null;
ObjectC objectCAlias = null;
var query = session.QueryOver<ObjectA>();
var results = query
.JoinAlias(x => x.listOfBs, () => objectBAlias)
.JoinAlias(x => objectBAlias.ObjectC, () => objectCAlias)
.TransformUsing(new DistinctRootEntityResultTransformer())
.List<ObjectA>();
class ObjectA
{
IList<ObjectB> listOfBs;
}
class ObjectB
{
ObjectA a;
ObjectC c;
}
class ObjectC
{
int x;
}
ObjectA与ObjectC的关系为many-to-many
,ObjectB为连接表。 ObjectA有一个ObjectB列表,而ObjectB有一个ObjectC的比例。我试图加载ObjectC,但没有成功。
我将所有ObjectC充分加载的唯一方法就是这样做:
foreach (ObjectA a in results)
{
foreach (var b in a.listOfBs)
{
NHibernateUtil.Initialize(b.c);
}
}
但这似乎并不像是可以扩展的东西。
答案 0 :(得分:1)
我建议 - 不要尝试(急切加载多对多)。相反 - 使用内置功能:
NHibernate可以有效地使用批量提取,也就是说,如果访问一个代理(或集合),NHibernate可以加载几个未初始化的代理。批量提取是懒惰选择提取策略的优化。有两种方法可以调整批处理获取:在类和集合级别上。
要了解更多详情,请查看以下内容:
获取收藏是一项艰难的操作。它有很多副作用(正如你所知,当有更多的集合时)。但即使提取了一个集合,我们也会加载许多重复的行。