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

时间:2010-10-03 02:24:15

标签: c# nhibernate design-patterns orm fluent-nhibernate

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

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

这是我的实施:

Domain obj:

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; }

}

  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];

        }
    }

以上将成功返回Connection对象。但是,通过抛出异常来访问CurrentServer属性。这是我的假设,NHibernate知道这个对象与'CurrentServer'之间的关系,因此在请求时懒洋洋地加载该对象。有人能告诉我哪里被误入歧途吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果是网络应用,请使用每次请求会话模式。如果它是Windows应用程序。这将需要更多的工作。我在Windows窗体的生命周期中保持会话打开并将其处理在FormClosing事件中。这适用于除少数情况之外的所有情况。

我不能为15分做什么? : - )