2010-04-07 14 views
5

Ich bin derzeit mit diesem Problem "Sammlung wurde modifiziert; Enumeration Operation kann nicht ausgeführt werden" Problem.NHibernate: Sammlung wurde geändert; Enumeration Operation kann nicht ausgeführt werden

Ich habe über diese Fehlermeldung gesucht, und es ist alles im Zusammenhang mit der Foreach-Anweisung. Ich habe einige foreach-Anweisungen, aber sie repräsentieren einfach nur die Daten. Ich benutzte keine entfernen oder hinzufügen innerhalb der Foreach-Anweisung.

HINWEIS:

  1. Der Fehler tritt zufällig (etwa 4-5 mal pro Tag).
  2. Die Anwendung ist die MVC-Website.
  3. Es gibt ungefähr 5 Benutzer, die diese Anwendungen bedienen (ungefähr 150 Aufträge pro Tag). Könnte es sein, dass ein anderer Benutzer die Sammlung geändert hat und dann dieser Fehler auftritt?
  4. Ich habe log4net Setup und die Einstellungen here
  5. Vergewissern Sie sich, dass der Controller einen parameter öffentlichen Konstruktor hat ich parameterlos öffentlichen Konstruktor in AdminProductController

Hat jemand wissen, warum dies geschehen gefunden werden kann und Wie behebe ich dieses Problem?

Ein Freund (Oskar) erwähnt, dass

„Theorie: Vielleicht ist das Problem, dass Ihre Konfiguration und Sitzungs Fabrik auf der ersten Anforderung initialisiert wird nach Neustart der Anwendung Wenn eine zweite Anforderung eingeht. bevor die erste Anfrage abgeschlossen ist, vielleicht wird es auch versuchen, zu initialisieren und dann dieses Problem irgendwie auszulösen. "

Vielen Dank.

Daoming

Hier ist die Fehlermeldung:

System.InvalidOperationException Sammlung modifiziert wurde; Aufzählungsoperation wird möglicherweise nicht ausgeführt. System.InvalidOperationException: Beim Versuch, einen Controller vom Typ 'WebController.Controllers.Admin.AdminProductController' zu erstellen, ist ein Fehler aufgetreten. Stellen Sie sicher, dass der Controller über einen parameterlosen öffentlichen Konstruktor verfügt. ---> System.Reflection.TargetInvocationException: Vom Ziel eines Aufrufs wurde eine Ausnahme ausgelöst. ---> NHibernate.MappingException: Datenspeicher konnte nicht vom Eingabestream aus konfiguriert werden DomainModel.Entities.Mappings.OrderProductVariant.hbm.xml ---> System.InvalidOperationException: Sammlung wurde geändert; Aufzählungsoperation wird möglicherweise nicht ausgeführt. bei System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext() bei System.Xml.Schema.XmlSchemaSet.AddSchemaToSet (XmlSchema Schema) bei System.Xml.Schema.XmlSchemaSet.Add (String target, XmlSchema Schema) bei System .Xml.Schema.XmlSchemaSet.Add (XmlSchema-Schema) bei NHibernate.Cfg.Configuration.LoadMappingDocument (XmlReader hbmReader, String-Name) bei NHibernate.Cfg.Configuration.AddInputStream (Stream xmlInputStream, String-Name) --- Ende der inneren Ausnahme Stack-Trace --- bei NHibernate.Cfg.Configuration.LogAndThrow (Ausnahme Ausnahme) bei NHibernate.Cfg.Configuration.AddInputStream (Stream xmlInputStream, String name) bei NHibernate.Cfg.Configuration.AddResource (String Pfad, Assembly assembly) bei NHibernate.Cfg.Configuration.AddAssembly (Assembly assembly) bei DomainModel.RepositoryBase ..ctor() bei WebController.Controllers._baseController..ctor() bei WebController.Controllers.Admin.AdminProductController..ctor() bei System.RuntimeType.CreateInstanceImpl (Boolean publicO nly, Boolean skipVisibilityChecks, Boolean fillCache) --- Ende der inneren Ausnahmestapelüberwachung --- bei System.RuntimeType.CreateInstanceImpl (Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache) bei System.Activator.CreateInstance (Typ Typ, Boolean nonPublic) bei System.Web.Mvc.DefaultControllerFactory.GetControllerInstance (RequestContext requestContext, Typ controllerType) --- Ende der inneren Ausnahmestapelaufzeichnung --- bei System.Web.Mvc.DefaultControllerFactory.GetControllerInstance (RequestContext requestContext, Type controllerType) bei System.Web.Mvc.DefaultControllerFactory.CreateController (RequestContext requestContext, String controllerName) bei System.Web.Mvc.MvcHandler.ProcessRequestInit (HttpContextBase httpContext, ICon troller & Controller IControllerFactory & Fabrik) bei System.Web.Mvc.MvcHandler.BeginProcessRequest (Httpcontextbase Httpcontext, AsyncCallback Rückruf, Objektzustand) bei System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() bei System.Web.HttpApplication.ExecuteStep (IExecutionStep Schritt, Boolean & completedSynchronously)

Antwort

4

Oskar richtig ist. Zwei separate Threads versuchen, die Sitzungsfabrik gleichzeitig zu initialisieren. Schlagen Sie vor, dass Sie den Initialisierungscode einrasten, vielleicht nur mit dem Schlüssel lock und einem geeigneten Synchronisationsobjekt. Wir haben ein Muster wie diese, mit einem der Schlösser von der Wintellect PowerThreading Bibliothek verwendet:

using (_lock.WaitToRead()) 
{ 
    if (Factory != null) return Factory; 
} 
using (_lock.WaitToWrite()) 
{ 
    if (Factory != null) return Factory; 
    Factory = ConfigureFactory(); 
    return Factory; 
} 

Sie mehr konnte einfach benutzen Sie einfach die lock Schlüsselwort und ein Vier-Augen-Sperrmuster wie folgt:

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; 
      } 
     } 
    } 
} 
+0

HI David, ich habe das Codebeispiel hinzugefügt. Ich denke, ich baue die Konfiguration mehrfach aus den log4net-Details. Könnten Sie mich beraten? Vielen Dank. –

+0

Was ist mit dem Konstruktor im Controller - können Sie das posten? –

+0

HI David, der Controller-Beispielcode wurde hinzugefügt. Danke vielmals. –

Verwandte Themen