将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>
答案 0 :(得分:1)
执行某些保存/更新操作后会发生这种情况吗?你何时何地结束会议?对我来说,这听起来像是在保存调用之后立即关闭会话,或者在网页呈现之前以其他方式关闭会话。换句话说,请确保您在View模式中使用Open Session,并仅在当前Web请求结束时关闭会话。您还可以查看此post。
答案 1 :(得分:0)
当检索对象图时,它们会保留对产生它们的会话的引用。他们使用该会话来延迟加载他们的属性。如果原始会话已关闭,则在尝试访问它们时,您将收到此错误(或者就像它一样)。开设新会议无济于事。
您可以尝试查找原始请求会话的关闭位置并停止。你有同样的要求吗?如果你没有尝试将对象连接到新会话 - 我认为它是Session.Lock(YourObject)
。或者,您可以从新会话中再次检索该对象。
答案 2 :(得分:0)
出于某种原因,当您调用SessionFactory.OpenSession()时,您将获得一个新的ISession。您是否首次使用会话在using
块中包含对它的访问权限?你为什么还要再次调用OpenSession--对会话的引用发生了什么?