NHibernate:修改收集;枚举操作不能执行

NHibernate:修改收集;枚举操作不能执行,nhibernate,Nhibernate,我目前正在努力解决这个“集合被修改;枚举操作可能无法执行”的问题 我已经搜索了这个错误消息,它都与foreach语句有关。我确实有一些foreach语句,但它们只是简单地表示数据。我没有在foreach语句中使用任何删除或添加 注: 错误会随机发生(大约每天4-5次) 该应用程序是MVC网站 大约有5个用户操作此应用程序(每天约150个订单)。是否可能是其他用户修改了集合,然后出现此错误 我有log4net设置,可以找到设置 确保控制器具有无参数公共构造函数我在AdminProductContr

我目前正在努力解决这个“集合被修改;枚举操作可能无法执行”的问题

我已经搜索了这个错误消息,它都与foreach语句有关。我确实有一些foreach语句,但它们只是简单地表示数据。我没有在foreach语句中使用任何删除添加

注:

  • 错误会随机发生(大约每天4-5次)
  • 该应用程序是MVC网站
  • 大约有5个用户操作此应用程序(每天约150个订单)。是否可能是其他用户修改了集合,然后出现此错误
  • 我有log4net设置,可以找到设置
  • 确保控制器具有无参数公共构造函数我在AdminProductController中确实具有无参数公共构造函数
  • 有人知道为什么会发生这种情况以及如何解决这个问题吗

    一位朋友(奥斯卡)提到了这一点

    理论:也许问题在于 您的配置和会话工厂 在第一个请求时初始化 应用程序重新启动后。如果 请求在第一个请求之前到达 请求完成了,也许会 还要尝试初始化,然后重试 以某种方式引发了这个问题。”

    非常感谢

    道明

    以下是错误消息:

    系统无效操作异常 收集被修改;枚举操作不能执行。 System.InvalidOperationException:尝试创建“WebController.Controllers.Admin.AdminProductController”类型的控制器时出错。确保控制器具有无参数公共构造函数。-->System.Reflection.TargetInvocationException:调用的目标已引发异常。-->NHibernate.MappingException:无法从输入流DomainModel.Entities.Mappings.OrderProductVariant.hbm.xml配置数据存储--->System.InvalidOperationException:集合已修改;枚举操作可能无法执行。 在System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext()中 位于System.Xml.Schema.XmlSchemaSet.AddSchemaToSet(XmlSchema模式) 在System.Xml.Schema.XmlSchemaSet.Add(字符串targetNamespace,XmlSchema) 位于System.Xml.Schema.XmlSchemaSet.Add(XmlSchema) 位于NHibernate.Cfg.Configuration.LoadMappingDocument(XmlReader hbmReader,字符串名) 在NHibernate.Cfg.Configuration.AddInputStream(流xmlInputStream,字符串名) ---内部异常堆栈跟踪的结束--- 位于NHibernate.Cfg.Configuration.loganthrow(异常) 在NHibernate.Cfg.Configuration.AddInputStream(流xmlInputStream,字符串名) 在NHibernate.Cfg.Configuration.AddResource(字符串路径,程序集) 在NHibernate.Cfg.Configuration.AddAssembly(程序集)中 在DomainModel.RepositoryBase..ctor()中 在WebController.Controllers.\u baseController..ctor()上 在WebController.Controllers.Admin.AdminProductController..ctor()上 位于System.RuntimeType.CreateInstanceImpl(布尔publicOnly、布尔skipVisibilityChecks、布尔fillCache) ---内部异常堆栈跟踪的结束--- 位于System.RuntimeType.CreateInstanceImpl(布尔publicOnly、布尔skipVisibilityChecks、布尔fillCache) 位于System.Activator.CreateInstance(类型,布尔非公共) 位于System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext RequestContext,类型controllerType) ---内部异常堆栈跟踪的结束--- 位于System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext RequestContext,类型controllerType) 位于System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext RequestContext,String controllerName) 位于System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext、IController和controller、IControllerFactory和factory) 位于System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext、AsyncCallback回调、对象状态) 在System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()中
    在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值&同步完成)

    Oskar是正确的。两个单独的线程试图同时初始化会话工厂。建议您对初始化代码进行一些锁定,可能只是使用
    lock
    关键字和合适的同步对象。我们使用了如下模式,使用Wintellect PowerThreading库中的一个锁:

    using (_lock.WaitToRead())
    {
        if (Factory != null) return Factory;
    }
    using (_lock.WaitToWrite())
    {
        if (Factory != null) return Factory;
        Factory = ConfigureFactory();
        return Factory;
    }
    
    您可以更简单地使用
    lock
    关键字和双重检查锁定模式,如下所示:

    class NestedSessionManager
    {
        internal static SessionManager _sessionManager;
        private static readonly object _syncRoot = new object();
    
        internal static SessionManager sessionManager
        {
            get
            {
                if (_sessionManager != null) return _sessionManager;
                lock (_syncRoot)
                {
                    if (_sessionManager != null) return _sessionManager;
                    _sessionManager = new SessionManager();
                    return _sessionManager;
                }
            }
        }
    }
    

    嗨,大卫,我已经添加了代码示例。我想我正在从log4net细节构建多次配置。你能给我一些建议吗?谢谢。控制器中的构造函数怎么样?你能发布吗?嗨,大卫,控制器示例代码已经包含在内了。非常感谢。嗨,大卫,我怎样才能在现有代码中实现锁呢?你能给我提供一个样品吗?非常感谢。大卫。我现在知道如何使用lock关键字了。:)