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

本文关键字:应用程序 执行 延迟加载 web | 更新日期: 2023-09-27 18:16:40

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

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

 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

惰性初始化role: Location集合。没有附件,会话或会话已关闭"}

我知道会议结束了,但我无能为力。

我知道会议结束了,但我无能为力。

我有一个难题:1)代码在从DB获取数据后使用集合,并且需要会话仍然是打开的。让会话一直保持开放状态是一种不好的做法。(没有using).

2)即使我在整个应用程序运行时保持会话打开,我已经构建了一个n层web应用程序。DAL应该是通用的,而不是暴露某些实现的会话(在本例中是NH)。

3)急于加载似乎是解决方案,但它是浪费-因为我将不得不急于加载所有的数据的情况下,一个对象与其他对象的列表在它。(这甚至可以递归地继续)

我该怎么办?

TIA

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

通灵调试:

看起来您正在尝试在关闭会话后加载集合,或者您正在尝试在加载根实体的会话之外的另一个会话上加载集合。

不要这样做

正如Jason所建议的,这是因为您已经关闭了会话。

如果你正在使用Web Forms,那么你可能想看看Session Per Request,其中Session在Http请求开始时打开,在Http请求结束时关闭。(对于那些RequestBegin/RequestEnd事件的全局解析)

这将使您能够惰性加载。

或者,你可以通过实现一个抓取策略来急切地获取你想要的数据,你把这个抓取策略传递给存储库,说"在获取根的同时获取这个相关的数据"。