0

我是 NHibernate 的初学者。我必须写一个关于“员工”的复杂查询,以根据 where 子句填充员工的所有关联。我正在寻找与此类似的内容 - 当您执行 Employee.FindById(10) 时应该填写 OwnedDepartment、SubscribedGroups 等。

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


更新

我刚刚在阅读有关急切加载的内容,这与加载有关吗?在我的地图中,我没有提到任何加载技术,所以默认情况下,我所有员工的子元素都已经加载完毕。下面触发了一堆查询。

4

1 回答 1

0

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

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

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

于 2013-09-26T19:10:17.447 回答