无法在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
通灵调试:
看起来您正在尝试在关闭会话后加载集合,或者您正在尝试在加载根实体的会话之外的另一个会话上加载集合。
不要这样做
正如Jason所建议的,这是因为您已经关闭了会话。
如果你正在使用Web Forms,那么你可能想看看Session Per Request,其中Session在Http请求开始时打开,在Http请求结束时关闭。(对于那些RequestBegin/RequestEnd事件的全局解析)
这将使您能够惰性加载。
或者,你可以通过实现一个抓取策略来急切地获取你想要的数据,你把这个抓取策略传递给存储库,说"在获取根的同时获取这个相关的数据"。