|
3
|
| john84 · 技术社区 · 15 年前 |
|
|
1
2
问题是联系人是延迟加载的,即,在初始查询中不会从数据库中提取集合。我假定您将对象直接传递给视图,而不是使用视图模型?你有几个选择,每个都有缺点。
更新以响应评论: 让集合懒散地加载仍然有很大的好处。当然,在这种情况下,您不会从客户对象上的延迟加载联系人中受益,因为您需要使用它们。但在另一个上下文中,您可能只需要客户名称和ID—您可以放心,这不会生成一个带有联接等的大型查询。 要在视图中使用打开的会话,您不必显式地将会话传递给视图,而只需像以前一样传递对象,但保持会话打开-当您尝试访问联系人集合时,NH将自动生成新的查询。(这是因为客户对象仍然“附加”到后台打开的会话)。这里唯一的区别是,您需要关闭会话,而不是在控制器中(当前正使用.close()显式关闭会话,或使用“using”隐式关闭会话)。关于在哪里打开和关闭会话-有不同的方法:
对于最后两个,您可能会想,“但这意味着为每个页面请求创建一个会话!”-你是对的,但实际上有多少页不会转到数据库?另外,一旦创建了会话工厂,会话创建就变得轻量级了。
当然,许多人不喜欢在视图中打开会话,因为您无法控制纯粹在控制器中生成的查询-视图触发了许多查询,这可能导致不可预测的性能。 3与2稍有不同,因为在不需要惰性加载集合的情况下,它不会从数据库中提取。例如,在这种情况下,您可能使用完整的对象图复制到一个ViewModel,但在另一种情况下,您可能只使用客户名称和ID的ViewModel—在这种情况下,不会不必要地执行联系人集合的联接。在我看来,3是做事情的正确方式——但是你最终会创建更多的对象(因为视图对象)。 |
|
|
Nico Pizzo · 子查询上的nhibernate联接 8 年前 |
|
|
YMC · 无法在Nhb 4中构建只有特定字段可供选择的2个表联接 8 年前 |
|
|
Stu · 具有特定类型的字符串外键的NHibernate映射 8 年前 |
|
|
Zout · 为Hibernate的HiLo算法管理的列生成ID 8 年前 |