繁体   English   中英

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

[英]cannot perform lazy loading in n-tier web application

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

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

 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,没有会话或会话被关闭“}

我了解会话已关闭,但是我无能为力。

我了解会话已关闭,但是我无能为力。

我有一个难题:1)代码从数据库中获取数据后使用该集合,并且需要该会话仍处于打开状态。 让会话一直处于开放状态是一种不好的做法。 (不using )。

2)即使我在整个应用程序运行期间都保持会话打开状态,也已经构建了一个n层Web应用程序。 DAL应该是通用的,并且不公开某些实现的会话(在这种情况下为NH)。

3)急于加载似乎是解决方案,但是这很浪费-因为在一个对象中包含其他对象的情况下,我必须急于加载所有数据。 (这甚至可以反复发生)

我该怎么办?

TIA

心理调试:

似乎您在关闭会话后正在尝试加载集合,或者试图在与加载根实体的会话不同的会话中加载集合。

不要这样

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

如果您使用的是Web窗体,则可能需要查看“每个请求的会话”,其中在Http请求的开始处打开一个会话,在Http请求的结束处关闭一个会话。 (这些RequestBegin / RequestEnd事件的全局asax)

这将使您能够延迟加载。

另外,您也可以通过实施传递到存储库的“获取策略”,说“在获取我的根的同时获取相关数据”,来急切地获取所需的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM