[英]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.