C# NHibernate-多对一-NHibernate.LazyInitializationException-无法初始化代理

C# NHibernate-多对一-NHibernate.LazyInitializationException-无法初始化代理,c#,nhibernate,design-patterns,orm,fluent-nhibernate,C#,Nhibernate,Design Patterns,Orm,Fluent Nhibernate,当我尝试访问存储在我的域对象的属性中的对象时,我会遇到此异常。我已经做了一些研究,但仍然不明白为什么会出现这个错误 我有一个非常基本的存储库,我在其中创建一个会话,然后使用ICriteria查询从结果列表中获取第一条记录。我的连接域对象具有映射到服务器的一对多关系。为什么会话在获取连接对象时不包括服务器作为代理?我不太熟悉NHibernate的会话管理 以下是我的实现: 域对象: public class Connection { public virtual int Id { get; pr

当我尝试访问存储在我的域对象的属性中的对象时,我会遇到此异常。我已经做了一些研究,但仍然不明白为什么会出现这个错误

我有一个非常基本的存储库,我在其中创建一个会话,然后使用ICriteria查询从结果列表中获取第一条记录。我的连接域对象具有映射到服务器的一对多关系。为什么会话在获取连接对象时不包括服务器作为代理?我不太熟悉NHibernate的会话管理

以下是我的实现:

域对象:

public class Connection {

public virtual int Id { get; private set; }


public virtual string FullName { get; set; }


public virtual string Email { get; set; }


public virtual string NickName { get; set; }


public virtual string Alternative { get; set; }


public virtual bool IsInvisible { get; set; }


public virtual Server CurrentServer { get; set; }
}

公共连接GetConnection()
{
使用(ISession session=NHibernateHelper.OpenSession())
{
ICriteria crit=session.CreateCriteria(连接类型));
临界SetMaxResults(1);
IList connection=crit.List();
返回连接[0];
}
}
上述操作将成功返回连接对象。但是,访问CurrentServer属性时会引发异常。我假设NHibernate知道该对象与“CurrentServer”之间的关系,因此会在请求时延迟加载该对象。有人能告诉我我在哪里被引入歧途吗


谢谢

首先处理会话,然后启动延迟加载。对象应该连接到会话以启用延迟加载。

由于Jamie Ide的评论,我找到了答案。问题是我正在用using语句包装我的会话。这意味着,当我试图访问服务器属性时,当前会话已被释放,因此延迟加载无法使用该会话获取服务器。

如果是web应用程序,请使用“按请求会话”模式。如果是Windows应用程序。这需要更多的工作。我在Windows窗体的生存期内保持会话打开,并在FormClosing事件中处理它。这对除少数情况外的所有情况都非常有效


15分我不做什么?:-)

将会话包装在using语句中可以消除延迟加载的可能性。@Jamie在仍然促进延迟加载的情况下,如何正确处理会话?@Nick您当然可以通过调用dispose方法手动处理会话。使用会话的最简单方法是为每个“用户操作”创建一个会话和一个事务。对于您构建的应用程序类型(web、winforms、wpf、服务等),用户的操作以不同的方式定义。我认为可以用using语句包装会话(我曾经尝试过),但不能使用简单的体系结构。@Nick——如果是web应用程序,请使用每个请求的会话模式。如果是Windows应用程序。这需要更多的工作。我在Windows窗体的生存期内保持会话打开,并在FormClosing事件中处理它。除了少数情况外,这对所有情况都很有效。谢谢你们。为了解决我的问题,我对不同的体系结构做了一些研究。我认为你们都在描述一种“工作单元”模式。这是我使用的解决方案,嘿,还不如收集:)再次感谢您的洞察力。
  public Connection GetConnection()
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            ICriteria crit = session.CreateCriteria(typeof(Connection));
            crit.SetMaxResults(1);
            IList<Connection> connection = crit.List<Connection>();
            return connection[0];

        }
    }