NHibernate +线程

时间:2011-09-21 10:52:47

标签: .net multithreading wcf nhibernate

我差不多有这样的代码:

public class WCFService
{
    public OperationResult Create(...)
    {
        List<SomeClass> classList = new List<SomeClass>();//Items are got from db using       NHibernate
        ...
        Thread t = new Thread(delegate () { 
            foreach ( item in classList)
            {
                Method(item);
            }
        }
    ...
    return new OperationResult();
    }

    public void Method ( List<SomeClass> list) //doesn't use NHibernate Session
    {
    Conslole.Writeline(list.ToString());
    }

}

void main()
{
    WCFService service = new WCFService();
    service.Create(...);
}

在控制台输出中执行后,只有List的一部分。我认为Method无法访问列表元素。在调试时,有这样的消息而不是变量值:“功能评估被禁用,因为先前的功能评估超时。您必须继续执行以重新启用功能评估”。或LazyInitialization异常“无法初始化代理 - 无会话”。是NHibernate会话中的问题还是其他什么?我该如何解决? 方法在单独的线程中,因为它需要花费太多时间,并且创建结果需要尽快返回。

1 个答案:

答案 0 :(得分:1)

您获得了LazyInitialization异常,因为该方法正在尝试访问未初始化的属性。默认情况下,NH关联是延迟加载的,因此在访问属性时,NH会尝试从会话中加载数据,当然这段时间早已消失并被处理掉。

一些选择:

  1. 急切地使用'lazy = false'
  2. 加载映射中的关联
  3. 急切地使用“FetchMode = join”
  4. 加载查询中的关联
  5. 手动进行加载。获取实体后,访问属性以确保它们已加载(或在关联上使用NHibernateUtil.Initialize())。
  6. 做这样的事情http://trentacular.com/2009/08/how-to-use-nhibernate-lazy-initializing-proxies-with-web-services-or-wcf/