2010-04-07 9 views
5

yürütmek olmayabilir.NHibernate: Koleksiyon değiştirildi; "; Numaralama işlemi</strong> yürütmek olmayabilir <strong>Koleksiyon değiştirildi" sorunu numaralama işlemi Şu anda bununla mücadele ediyorum

Bu hata iletisini aradım ve hepsi foreach ifadesiyle ilgili. Bazı foreach açıklamalarım var, ancak sadece verileri temsil ediyorlar. Herhangi bir kullanmadı veya foreach deyiminin içine ekleyin.

NOT:

hata rasgele oluşan
  1. (yaklaşık günde 4-5 defa).
  2. Uygulama MVC web sitesidir.
  3. Bu uygulamayı yaklaşık 5 kullanıcı çalıştırıyor (günde yaklaşık 150 sipariş). Koleksiyonu değiştiren başka bir kullanıcı olabilir mi ve sonra bu hatayı mı yapıyor?
  4. Ben kurulum log4net ve ayarlar bu olanların neden

bilen var mı kontrolör ben AdminProductController içinde parametresiz ortak oluşturucusu var parametresiz public kurucu olduğundan emin olun

  • here bulunabilir ve Bu sorunu nasıl çözebilirim?

    Bir arkadaşım (Oskar) bahsettiği

    "Teori: Belki sorun yapılandırma ve oturum fabrika uygulama yeniden başlatıldıktan sonra ilk istek üzerine başlatılır olmasıdır ikinci istek gelirse. İlk isteği bitmeden, belki de başlatır ve bu sorunu bir şekilde tetikleyen olacaktır. "

    Çok teşekkürler. İşte Daoming

    hata iletisi: Koleksiyon değiştirildi

    System.InvalidOperationException; numaralandırma işlemi yapılamayabilir. System.InvalidOperationException: 'WebController.Controllers.Admin.AdminProductController' türünde bir denetleyici oluşturmaya çalışırken bir hata oluştu. Denetleyicinin parametresiz bir kamu kurucusuna sahip olduğundan emin olun. ---> System.Reflection.TargetInvocationException: İstisnanın hedefi tarafından istisna atıldı. ---> NHibernate.MappingException: Veri akışını DomainModel.Entities.Mappings.OrderProductVariant.hbm.xml ---> System.InvalidOperationException adresinden yapılandıramadı: Koleksiyon değiştirildi; numaralandırma işlemi yapılamayabilir. System.Xml.Schema.XmlSchemaSet.Add de System.Xml.Schema.XmlSchemaSet.AddSchemaToSet (XmlSchema şema) (Dize targetNamespace, XmlSchema şema) de System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext() de Sisteminde NHibernate.Cfg.Configuration .Xml.Schema.XmlSchemaSet.Add (XmlSchema şeması) .LoadMappingDocument (XmlReader hbmReader, Dize adı) adresindeki NHibernate.Cfg.Configuration.AddInputStream (Akış xmlInputStream, Dize adı) --- İç istisnanın yığın izinin sonu --- , NHibernate.Cfg.Configuration.LogAndThrow (Özel durum istisnası) NHibernate.Cfg.Configuration.AddAssembly de NHibernate.Cfg.Configuration.AddResource (Dize yolu, derleme birleştirme) de NHibernate.Cfg.Configuration.AddInputStream (Akış xmlInputStream, dize adı) (Assembly montaj) de DomainModel.RepositoryBase at ..ctor() WebController.Controllers._baseController..ctor() WebController.Controllers.Admin.AdminProductController..ctor() at System.RuntimeType.CreateInstanceImpl (Boolean publicO System.Activator.CreateInstance de System.RuntimeType.CreateInstanceImpl (Boolean publicOnly, Boolean skipVisibilityChecks, Boolean FillCache) de nly, Boole skipVisibilityChecks, Boolean FillCache) --- iç durum yığın izleme sonu --- (Tip türü, Boolean nonPublic) System.Web.Mvc.DefaultControllerFactory.GetControllerInstance (RequestContext requestContext, Type controllerType) --- İç istisna yığınının izinin bırakılması --- System.Web.Mvc.DefaultControllerFactory.GetControllerInstance (RequestContext requestContext, Type controllerType) System.Web.Mvc.DefaultControllerFactory.CreateController (RequestContext requestContext, String controllerName) at System.Web.Mvc.MvcHandler.ProcessRequestInit (HttpContextBase httpContext, ICon System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute de troller & kontrolör, IControllerFactory & fabrika) System.Web.Mvc.MvcHandler.BeginProcessRequest de (HttpContextBase HttpContext, AsyncCallback geri arama, devlet Nesne) () System.Web.HttpApplication.ExecuteStep (IExecutionStep adımı, Boole & tamamlandıSenkronize)

  • cevap

    4

    Oskar haklı. İki ayrı iş parçacığı aynı anda oturum fabrikasını başlatmaya çalışıyor. Başlatma kodunun etrafına biraz kilitleme koymanızı öneriyoruz, belki de sadece lock anahtar sözcüğünü ve uygun bir senkronizasyon nesnesini kullanarak.

    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; 
          } 
         } 
        } 
    } 
    
    :

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

    Daha basitçe sadece bu yüzden gibi lock anahtar kelime ve bir kez daha kontrol kilitleme desen kullanabilirsiniz: Biz Wintellect PowerThreading kütüphanesinden kilitleri birini kullanarak, böyle bir desen kullandım

    +0

    Merhaba David, kod örneğini ekledim. Ben log4net ayrıntılarından defalarca yapılandırma yapıyorum sanırım. Bana tavsiyede bulunabilir misiniz? Teşekkür ederim. –

    +0

    Denetleyicideki kurucudan ne haber? –

    +0

    HI David, kontrolör örnek kodu dahil edildi. Çok teşekkürler. –

    İlgili konular