无法在n层Web应用程序中执行延迟加载

时间:2011-11-30 20:04:24

标签: c# asp.net .net nhibernate

我正在使用NH将数据库映射到名为location的对象,该对象具有一些属性和列表<Attachments>附件(与lcocation实例的一对多关系)。

我使用lambda表达式初始化location istance:

 public IList<T> GetAllByExpression(Expression<Func<T,bool>> expression)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            {
                return session.Query<T>().Where(expression).ToList();
            }
        }

在代码的某个稍后部分,我尝试访问location.attachments集合但获得异常:

{"Initializing[Location#543c7367-08fa-4469-a252-8e2c6163be22]-failed
     

懒惰地初始化角色集合:Location.Attachments,no   会话或会话已关闭“}

我理解会话已经结束,但我无能为力。

我理解会话已经结束,但我无能为力。

我有一个困境: 1)代码在从DB获取后使用该集合,并且需要会话仍然打开。  让会议一直开放是一种不好的做法。 (没有using)。

2)即使我在整个应用程序运行时期间打开会话,我也构建了一个n层Web应用程序。 DAL应该是通用的,不会暴露某些实现的会话(在这种情况下为NH)。

3)渴望加载似乎是解决方案,但这是浪费 - 因为我必须在一个包含其他对象列表的对象的情况下急切加载所有数据。 (这甚至可以继续反复出现)

我该怎么办?

TIA

2 个答案:

答案 0 :(得分:3)

心理调试:

看起来您在关闭会话后尝试加载集合,或者您尝试在与加载根实体的会话不同的会话上加载集合。

不要这样做。

答案 1 :(得分:1)

正如杰森所说,这是因为你已经关闭了会议。

如果您正在使用Web窗体,那么您可能需要查看Session Per Request,其中会话在Http请求开始时打开,并在Http请求结束时关闭。 (那些RequestBegin / RequestEnd事件的全局asax)

这将使您能够延迟加载。

或者,您可以通过实施您传递到存储库的提取策略来急切地获取您想要的数据,以便说明&#34;抓住这些相关数据,同时获取根&#34;。