我正在使用NH将数据库映射到名为location
的对象,该对象具有一些属性,并且列表<Attachments>
附件(与lcocation
的实例具有一对多关系)。无法在n层web应用程序中执行延迟加载
我用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,没有 会话或会话已关闭“}
我明白这个会议已经结束,但我没有什么可以做的。
我明白会议已经结束,但我无能为力。
我有一个困境: 1)代码使用从数据库中提取后的集合,并需要会话仍然是开放的。 将会话全部开放是一种不好的做法。 (没有using
)。
2)即使我在整个应用程序运行时期间打开会话,我也构建了一个n层Web应用程序。 DAL应该是通用的,并且不公开某些实现的会话(本例中为NH)。
3)急切的加载似乎是解决方案,但它是浪费 - 因为我必须急切地加载所有数据,以防其中包含其他对象列表的对象。 (甚至可以继续循环)
我该怎么办?
TIA
但我不能让会议永远开放? –
@Elad Benda:你不应该。对于单个工作单元,会话应该是短暂的。 – jason
所以我从ORM初始化了一个Location对象,后来我不得不解决它中的“附件”集合(一对多关系)。我怎样才能做到这一点? –