具有多个一对多映射的Nhibernate查询

时间:2013-09-26 17:15:03

标签: nhibernate fluent-nhibernate

我是NHibernate的初学者。我必须写一个复杂的查询,说“Employee”,根据where子句填充Employee的所有关联。我正在寻找的是类似的 - 当你做一个Employee.FindById(10)应该填写OwnedDepartment,SubscribedGroups等。

我需要填充的Employee模型非常繁重(与其他对象有很多关联) 但我需要填充少数协会。如何使用查询来实现它?或任何其他方法?


更新

我刚才正在阅读关于急切加载的内容,是否与加载有关?在我的地图中,我没有提到任何加载技术,因此默认情况下我所有员工的子元素都已加载。在下面触发了一堆查询。

1 个答案:

答案 0 :(得分:0)

默认情况下,所有关联都是延迟加载的。这意味着当您访问它时会触发负载 - 这就是发出这么多查询的原因。如果您想急切地加载数据(这意味着要么加入表格,或者 - 很少 - 一次执行其他选择查询),您必须在映射或查询中指定它,具体取决于您获取数据的方式。这个概念通常被称为“渴望获取”。

如果您想通过ID获取单个Employee,标准方法是使用session.Get<Employee>(10) - 但这种方法意味着需要在映射中指定急切加载。对于按代码进行映射,对于集合将为c.Lazy(CollectionLazy.NoLazy);,对于多对一对象为c.Lazy(LazyRelation.NoProxy) - 有关详细信息,请参阅herehere

我更喜欢在查询中指定那种东西 - 只是在使用它的地方,而不是整个实体的全局,无论谁在提取和为什么。在LINQ提供程序中,对于集合,您有FetchMany(x => x.SubscribedGroups),对于多对一关系,您有Fetch(x => x.OwnedDepartment)。您可以在QueryOver中找到类似的选项,如果这是您的选择。