使用NHibernate的ASP.NET应用程序中的LazyInitializationException

时间:2010-11-28 04:55:48

标签: asp.net nhibernate

将NHibernate与ASP.NET 4一起使用。

我在检索对象方面没有遇到任何问题,但我只是抓住了一些我无法弄清楚的嵌套对象。

我正在使用 lazy = true ,当访问延迟加载集合时,我收到消息:

Initializing[type#3]-failed to lazily initialize a collection of role: [type], no session or session was closed

即使我在访问对象之前立即调用SessionFactory.OpenSession(),也没有区别。我也尝试使用ISession 块在中访问该集合,但没有运气。

编辑添加 - 我在web.config中设置了current_session_context_class = web,我在BeginRequest上使用CurrentSessionContext.Bind。

有人可以提供一些建议吗?

不是MVC应用

我读过这个 - 不知道它有多准确,它是Hibernate: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2878

它讲述了多对多关系中的错误。

这是我的HBM映射:

<bag name="Objects" table="ObjectInstance" cascade="all" lazy="true">
  <key column="branchId" />
  <many-to-many class="InventoryObjectInstance" column="objectInstanceId" />
</bag>

3 个答案:

答案 0 :(得分:1)

执行某些保存/更新操作后会发生这种情况吗?你何时何地结束会议?对我来说,这听起来像是在保存调用之后立即关闭会话,或者在网页呈现之前以其他方式关闭会话。换句话说,请确保您在View模式中使用Open Session,并仅在当前Web请求结束时关闭会话。您还可以查看此post

答案 1 :(得分:0)

当检索对象图时,它们会保留对产生它们的会话的引用。他们使用该会话来延迟加载他们的属性。如果原始会话已关闭,则在尝试访问它们时,您将收到此错误(或者就像它一样)。开设新会议无济于事。

您可以尝试查找原始请求会话的关闭位置并停止。你有同样的要求吗?如果你没有尝试将对象连接到新会话 - 我认为它是Session.Lock(YourObject)。或者,您可以从新会话中再次检索该对象。

答案 2 :(得分:0)

出于某种原因,当您调用SessionFactory.OpenSession()时,您将获得一个新的ISession。您是否首次使用会话在using块中包含对它的访问权限?你为什么还要再次调用OpenSession--对会话的引用发生了什么?