Nhibernate / MVC:在View中处理延迟加载的集合

时间:2010-08-05 10:42:26

标签: asp.net-mvc nhibernate asp.net-mvc-2

我目前正在使用基于属性的方法来进行nhibernate会话管理,这意味着会话在Action方法的持续时间内是打开的,但是一旦控件传递给View就会关闭。

这对我来说似乎是一种很好的做法,然而我正在遇到延迟加载集合的问题。(这很复杂,因为有些集合似乎是延迟加载,即使它们有Not.LazyLoad()在流畅的映射中设置。)

我认为,我的选择是:

  1. 更改我的ISession管理策略,在视图中保持会话开放
  2. 更好地利用ViewModels (我目前没有在任何地方使用它们。)
  3. 急切加载导致问题的所有收藏(可能是分页)(流畅的问题无法承受)
  4. 1似乎有点不对 - 但可能是'最简单'的解决方案。 2可能是正确的方法,但在某些情况下,ViewModel似乎有点多余,我厌恶引入更多的类来处理这个问题。 3似乎有点肮脏。

    您怎么看?

3 个答案:

答案 0 :(得分:3)

处理此问题的最佳方法(我认为无论如何)是在您的UI和您的存储库之间引入服务层;它应该负责加载视图所需的所有内容,并将展平(并完全填充)的dto传递给视图。

通常,我更进一步,将从服务层返回的dtos映射到视图模型,这些模型通常需要包含特定于视图的数据,并且不适合包含在来自服务层的dtos中。请记住,在这种情况下,Automapper是您的朋友。

使用open-session-in-view模式仍然是完全可以接受的,只是没有你的视图调用实体模型上的延迟加载 - 这几乎总是一个可怕的想法。

答案 1 :(得分:1)

将您当前的用法视为进行隐式数据库操作。该对象被发送到View,但该对象包含代理,当被触摸时将尝试返回数据,这需要数据库操作。

现在,

  1. 扩展ISession生命,包括View,它没有错,只要你没有进行明确的数据库调用......
  2. 我不知道那个
  3. 这实际上是正确的方式,无论会话EOL如何:你应该尝试尽可能减少每个请求的查询,nhibernate通过懒惰加载,期货,multihql /标准等为你提供这种能力。
  4. 注意:虽然您可能已将一个集合映射为非延迟加载,但您查询如何并获得所需的结果集也很重要。例如,如果您使用的是HQL,请使用获取连接

答案 2 :(得分:0)

我认为第一种方法没有任何问题,而且最容易实施。

每个请求的会话是一个众所周知的NHibernate会话管理模式。