Domanda

Ricevo un errore dal raccoglitore del modello SharpArchitecture. " Collection è stata modificata; l'operazione di enumerazione potrebbe non essere eseguita. " (Traccia stack in basso).

Le mie pagine MVC per creare e modificare il mio SettingsModel generano l'errore. Questo è iniziato quando abbiamo aggiornato alla versione di rilascio di S # arp Architecture 1.0. La mia classe ha alcune liste come proprietà. Una delle liste contiene classi con un'altra un'altra lista come proprietà. Non sono sicuro di quale lista stia generando l'errore. Qualcuno può fornire indicazioni su come risolvere questo o cose da cercare nei miei modelli che potrebbero causarlo?

Questa è la mia classe SettingsModel:

public class SettingsModel : Entity
 {
  public SettingsModel() 
  {
   AttributeSettingsList = new List<AttributeSettingsModel>();
  }

  public virtual void AddAttributeSettings(AttributeSettingsModel attSettings)
  {
   AttributeSettingsList.Add(attSettings);
   attSettings.Settings = this;
  }


  [NotNullNotEmpty(Message = "Description must be provided")]
  public virtual string Description { get; set; }

  [DomainSignature]
  [Range(0, 100, Message = "ModelAPercentage must be between 0 and 100")]
  public virtual int ModelAPercentage { get; set; }

  [DomainSignature]
  [Range(0, 100, Message = "ModelBPercentage must be between 0 and 100")]
  public virtual int ModelBPercentage { get; set; }

  public virtual IList<AttributeSettingsModel> AttributeSettingsList { get; set; }

  public virtual IList<EntityMappingModel> EntityMappingList { get; set; }

  public SettingsModel(string Description, int ModelAPercentage, int ModelBPercentage)
   : this() 
  {
   this.Description = Description;
   this.ModelAPercentage = ModelAPercentage;
   this.ModelBPercentage = ModelBPercentage;
  }

 }

Questo è il metodo SharpArchitecture che genera l'errore:

    private void SetEntityCollectionProperty(ModelBindingContext bindingContext,
        PropertyDescriptor propertyDescriptor, object value) {

        if (value as IEnumerable != null &&
            IsSimpleGenericBindableEntityCollection(propertyDescriptor.PropertyType)) {

            object entityCollection = propertyDescriptor.GetValue(bindingContext.Model);
            Type entityCollectionType = entityCollection.GetType();

            foreach (object entity in (value as IEnumerable)) {
                entityCollectionType.InvokeMember("Add",
                    BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, entityCollection,
                    new object[] { entity });
            }
        }
    }

Ecco la traccia dello stack:

[InvalidOperationException: la raccolta è stata modificata; l'operazione di enumerazione potrebbe non essere eseguita.]    System.ThrowHelper.ThrowInvalidOperationException (risorsa ExceptionResource) +51    System.Collections.Generic.Enumerator.MoveNextRare () +7661017    System.Collections.Generic.Enumerator.MoveNext () +61    SharpArch.Web.ModelBinder.SharpModelBinder.SetEntityCollectionProperty (ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, Value object) +358    SharpArch.Web.ModelBinder.SharpModelBinder.SetProperty (ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, Valore oggetto) +61    System.Web.Mvc.DefaultModelBinder.BindProperty (ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) +265    SharpArch.Web.ModelBinder.SharpModelBinder.BindProperty (ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) +225    System.Web.Mvc.DefaultModelBinder.BindProperties (ControllerContext controllerContext, ModelBindingContext bindingContext) +125    System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel (ControllerContext controllerContext, ModelBindingContext bindingContext, Modello a oggetti) +293    System.Web.Mvc.DefaultModelBinder.BindComplexModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +772    System.Web.Mvc.DefaultModelBinder.BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +345    SharpArch.Web.ModelBinder.SharpModelBinder.BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +39    System.Web.Mvc.DefaultModelBinder.UpdateCollection (ControllerContext controllerContext, ModelBindingContext bindingContext, Type elementType) +408    System.Web.Mvc.DefaultModelBinder.BindComplexModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +756    System.Web.Mvc.DefaultModelBinder.BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +345    SharpArch.Web.ModelBinder.SharpModelBinder.BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +39    System.Web.Mvc.DefaultModelBinder.BindProperty (ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) +231    SharpArch.Web.ModelBinder.SharpModelBinder.BindProperty (ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) +225    System.Web.Mvc.DefaultModelBinder.BindProperties (ControllerContext controllerContext, ModelBindingContext bindingContext) +125    System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel (ControllerContext controllerContext, ModelBindingContext bindingContext, Modello a oggetti) +293    System.Web.Mvc.DefaultModelBinder.BindComplexModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +772    System.Web.Mvc.DefaultModelBinder.BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +345

È stato utile?

Soluzione

Sembra che ci sia un bug nel metodo SetEntityCollectionProperty dell'architettura nitida. È nelle ultime quattro righe:

        foreach (object entity in (value as IEnumerable)) {
            entityCollectionType.InvokeMember("Add",
                BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, entityCollection,
                new object[] { entity });
        }

Il suo intento sembra essere quello di popolare la classe di raccolta di modelli (entityCollection) dai valori in IEnumerable passati come valore. Tuttavia, questi due oggetti sono lo stesso riferimento. È già popolato. Quando il " Aggiungi " viene richiamato il metodo, l'oggetto entityCollection viene modificato che è lo stesso oggetto che viene iterato. Quindi viene generata l'eccezione.

Commenta o elimina quel blocco di codice e il tuo codice dovrebbe essere eseguito.

Altri suggerimenti

I commenti a questo blocco di codice influiscono su altre funzioni di S # arp?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top