NHibernate: Набор был изменен; операция перечисления не может выполниться

Я в настоящее время борюсь с этим "Набором, был изменен; операция перечисления не может выполнить" проблему.

Я искал об этом сообщении об ошибке, и оно все связано с foreach оператором. У меня действительно есть некоторые foreach операторы, но они просто представляют данные. Я не сделал использования, любой удаляет или добавляет в foreach операторе.

Примечание:

  1. Ошибка случайным образом происходит (приблизительно 4-5 раз в день).
  2. Приложение является веб-сайтом MVC.
  3. Существует приблизительно 5 пользователей, управляют этим приложения (приблизительно 150 заказов в день). Это могли быть некоторые другие пользователи, изменил набор, и затем происходите эта ошибка?
  4. У меня есть установка log4net, и настройки могут быть найдены здесь
  5. Удостоверьтесь, что контроллер имеет общедоступного конструктора без параметров, у меня действительно есть общедоступный конструктор без параметров в AdminProductController

Кто-либо знает, почему это происходит и как решить этот вопрос?

Друг (Oskar) упомянул это

"Теория: Возможно, проблема состоит в том, что Ваша фабрика конфигурации и сессии инициализируется по первому запросу после перезапуска приложения. Если второй запрос входит, прежде чем первый запрос закончен, возможно, он также попытается инициализировать и затем инициировавший эту проблему так или иначе".

Большое спасибо.

Daoming

Вот сообщение об ошибке:

Система. Набор InvalidOperationException был изменен; операция перечисления не может выполниться. Система. InvalidOperationException: ошибка произошла при попытке создать контроллер типа 'WebController. Контроллеры. Администратор. AdminProductController'. Удостоверьтесь, что контроллер имеет общедоступного конструктора без параметров.---> Система. Отражение. TargetInvocationException: Исключение было выдано целью вызова.---> NHibernate. MappingException: не Мог настроить хранилище данных от входного потока DomainModel.Entities.Mappings.OrderProductVariant.hbm.xml---> Система. InvalidOperationException: Набор был изменен; операция перечисления не может выполниться. в System. Наборы. ArrayList. ArrayListEnumeratorSimple. MoveNext () в Системе. Xml. Схема. XmlSchemaSet. AddSchemaToSet (схема XmlSchema) в System. Xml. Схема. XmlSchemaSet. Добавьте (Представьте в виде строки targetNamespace, схему XmlSchema) в System. Xml. Схема. XmlSchemaSet. Добавьте (схема XmlSchema) в NHibernate. Cfg. Конфигурация. LoadMappingDocument (XmlReader hbmReader, Имя строки) в NHibernate. Cfg. Конфигурация. AddInputStream (Поток xmlInputStream, Имя строки)---Конец внутреннего отслеживания стека исключительной ситуации---в NHibernate. Cfg. Конфигурация. LogAndThrow (Исключение исключения) в NHibernate. Cfg. Конфигурация. AddInputStream (Поток xmlInputStream, Имя строки) в NHibernate. Cfg. Конфигурация. AddResource (Строковый путь, блок блока) в NHibernate. Cfg. Конфигурация. AddAssembly (Блок блока) в DomainModel. RepositoryBase.. ctor () в WebController. Контроллеры. _ baseController.. ctor () в WebController. Контроллеры. Администратор. AdminProductController.. ctor () в System. RuntimeType. CreateInstanceImpl (булевская переменная publicOnly, булевская переменная skipVisibilityChecks, булевская переменная fillCache)---Конец внутреннего отслеживания стека исключительной ситуации---в System. RuntimeType. CreateInstanceImpl (булевская переменная publicOnly, булевская переменная skipVisibilityChecks, булевская переменная fillCache) в System. Активатор. CreateInstance (Вводят тип, непубличная булевская переменная) в System. Сеть. Mvc. DefaultControllerFactory. GetControllerInstance (RequestContext requestContext, Тип controllerType)---Конец внутреннего отслеживания стека исключительной ситуации---в System. Сеть. Mvc. DefaultControllerFactory. GetControllerInstance (RequestContext requestContext, Тип controllerType) в System. Сеть. Mvc. DefaultControllerFactory. CreateController (RequestContext requestContext, Строка controllerName) в System. Сеть. Mvc. MvcHandler. ProcessRequestInit (HttpContextBase httpContext, контроллер IController&, фабрика IControllerFactory&) в System. Сеть. Mvc. MvcHandler. BeginProcessRequest (HttpContextBase httpContext, обратный вызов AsyncCallback, Объектное состояние) в System. Сеть. HttpApplication. CallHandlerExecutionStep. Система. Сеть. HttpApplication. IExecutionStep. Выполнитесь () в Системе. Сеть. HttpApplication. ExecuteStep (шаг IExecutionStep, Boolean& completedSynchronously)

5
задан Daoming Yang 12 April 2010 в 07:43
поделиться

1 ответ

Оскар прав. Два отдельных потока одновременно пытаются инициализировать фабрику сеансов. Предложите вам установить некоторую блокировку вокруг кода инициализации, возможно, просто используя ключевое слово 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;
            }
        }
    }
}
4
ответ дан 15 December 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: