【问题标题】:NHibernate - Many To One - NHibernate.LazyInitializationException - Could not initialize proxyNHibernate - 多对一 - NHibernate.LazyInitializationException - 无法初始化代理
【发布时间】:2010-10-03 02:24:15
【问题描述】:

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

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

}

  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”的关系,因此会在请求时懒惰地加载该对象。谁能告诉我我在哪里误入歧途?

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 将会话包装在 using 语句中可以消除延迟加载的可能性。
    • @Jamie 如何在促进延迟加载的同时正确处理会话?
    • @Nick 当然,您可以通过调用 dispose 方法手动释放会话。使用会话的最简单方法是为每个“用户的操作”创建一个会话和一个事务。对于您构建的应用程序类型(web、winforms、wpf、服务等),用户的操作以不同的方式定义。我认为可以将会话包装在 using 语句中(我曾经尝试过),但不能使用简单的架构。
    • @Nick -- 如果是 Web 应用程序,请使用 session-per-request 模式。如果是 Windows 应用程序。这将需要更多的工作。我在 Windows 窗体的整个生命周期中都打开了一个会话,并在 FormClosing 事件中处理它。这适用于除少数情况外的所有情况。
    • 谢谢两位。我对不同的架构进行了一些研究以解决我的问题。我认为你们都在描述“工作单元”模式。这是我使用的解决方案nhforge.org/wikis/patternsandpractices/…
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      15 分我不会做什么? :-)

      【讨论】:

      • 嘿不妨收集一下:)再次感谢您的洞察力。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 2019-07-04
      • 1970-01-01
      • 2011-11-11
      相关资源
      最近更新 更多