我有一个库类,定义一些基本的获取/保存/删除方法。这里面,我使用NHibernate的做我的业务实体的工作。例如:

Public Class SecurityRepositoryNHibImpl : Implements ISecurityRepository
    Public Function GetUser(ByVal UUID As System.Guid) As Entities.User Implements ISecurityRepository.GetUser
        Dim eUser As Entities.User
        Using session As ISession = NHibernateHelper.OpenSession()
            eUser = session.Get(Of Entities.User)(UUID)
        End Using
        Return eUser
    End Function
End Class

不过,在我的User类我有一些属性和理想我想偷懒加载其他对象的集合。但当然,创建的ISession和配置存储库中,这是我的猜测是为什么,那外面,当我试图访问这些属性,我得到一个“无法初始化代理 - 没有会话”中。误差

是我唯一的选项,然后禁用延迟加载使用存储库时?或者是有可能(或只是愚蠢)以某种方式获取会话进入范围,业务层?

我不喜欢仓库模型,和NHibernate是在我成长(后很多最初的挫折试图使其工作),那么什么是你大师发现使用它们在一起的最佳方式?

我是很新,NHibernate和库模型一般(在工作中,我们主要还是使用VB6的!),所以请原谅什么可能是一个愚蠢的问题。感谢。


@mookid:谢谢,伙计,这是真正有用的,但我会离开它打开一会儿。它的后端到WCF的Web服务,并且所有的功能将每次通话的范围内,所以每次通话会话生活会很好。只是不知道如何让这样的事情在业务层的工作,最好是我不希望的业务对象有直接与任何NHibernate的类接口。我猜某种包装,为NHibernate的会议上至少夺取它了...... 嗯,你已经把我在正确的轨道上至少。


看起来像关键字这里是“工作单位”,为此一吨的资源相对于NHibernate的在网络上存在。尤其是找 Ayende的实施在犀牛下议院,他的应用基础架构网络直播(没有在冬眠犀牛。9) ,内容非常丰富。我最初是困惑,因为我虽然把一个“工作单元”在业务层混合的担忧,的但很快就纠正。

有帮助吗?

解决方案

创建您的ISession和明确处置它的仓库里一样,是确定对小和非常简单的项目 - 但是,正如你已经发现了,当你开始想使用那些NHibernate的支持很酷的功能来短。

您也许应该让会议的生活方式被一些版本库之外的控制 - 例如如果你正在做的ASP.NET Web应用程序,你可能想(如果我没有记错HttpContext.Current.Items)保存在当前请求的会议为Web请求期间,然后提交,并在请求结束处置(或回滚如果发生异常)。

我不知道要控制在ASP.NET应用程序会话的生活方式的最佳途径,但必须有某种方式有一个名为开头,并在每个请求的结束码。在ASP.NET MVC它可以通过从已经重写其OnActionExecutingOnActionExecuted方法基本控制器导出所有的控制器很容易地完成。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top