【问题标题】:nHibernate Error Illegal attempt to associate a collection with two open sessionsnHibernate 错误非法尝试将集合与两个打开的会话相关联
【发布时间】:2017-05-01 17:19:58
【问题描述】:

在今年 12 月初之前,我们当前的代码可以正常运行。最近我们有多个实例出现此错误。我无法发现我们当前的代码有任何问题。我们正在 global.asax 中创建一个 SessionFactory。然后为事务绑定和取消绑定。代码如下:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        try
        {
            if (!CurrentSessionContext.HasBind(sessionFactory))
            {
                CurrentSessionContext.Bind(sessionFactory.OpenSession());
            }
        }
        catch (Exception ex)
        {
            Logging.logError(ex);
        }
    }

    protected void Application_EndRequest(object sender, EventArgs e)
    {
        try
        {
            var session = CurrentSessionContext.Unbind(sessionFactory);
            if (session != null)
            {
                session.Dispose();
            }
        }
        catch (Exception ex)
        {
            Logging.logError(ex);
        }
    }

当我们的代码运行 session.Update(entity) 时,我们偶尔会遇到非法操作错误。我们还能做些什么来防止这个问题发生吗?

如果它来自我们的会话工厂的设置,这是我们创建会话工厂的代码:

sessionFactory = Fluently.Configure()
                        .Database(OracleClientConfiguration.Oracle10.ConnectionString(System.Configuration.ConfigurationManager.ConnectionStrings["nHibernateConnection"].ToString()).ShowSql())
                        .ExposeConfiguration(cfg => cfg.SetProperty(NHibernate.Cfg.Environment.CurrentSessionContextClass, "web"))
                        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<MyObjectMap>())
                        .ExposeConfiguration(cfg =>
                        {
                            UpdateEventListener updateListener = new UpdateEventListener();
                            cfg.EventListeners.PreUpdateEventListeners =
                                new IPreUpdateEventListener[] { updateListener };
                            cfg.EventListeners.PostLoadEventListeners =
                                new IPostLoadEventListener[] { updateListener };
                            cfg.EventListeners.PostUpdateEventListeners =
                                new IPostUpdateEventListener[] { updateListener };
                            cfg.EventListeners.PreInsertEventListeners =
                                new IPreInsertEventListener[] { updateListener };
                            cfg.EventListeners.PostInsertEventListeners =
                                new IPostInsertEventListener[] { updateListener };
                        })
                        .BuildSessionFactory();

【问题讨论】:

    标签: c# session nhibernate fluent-nhibernate


    【解决方案1】:

    这可能与同时运行的请求有关吗? IE。请求 1 启动并设置上下文会话并将某些内容保存到会话中;请求 2 现在启动并设置上下文会话,覆盖 R1 设置的会话; R1 继续,并尝试对与 R1 创建的会话相关联的集合进行处理。

    如果是这种情况或类似情况,您可能需要重新考虑上下文会话的使用。使用 DI 并使用请求范围注入会话可能会更好。

    【讨论】:

      猜你喜欢
      • 2015-03-23
      • 2010-09-18
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      相关资源
      最近更新 更多