Pregunta

Recibo un error de la carpeta del modelo SharpArchitecture. " La colección fue modificada; la operación de enumeración puede no ejecutarse. " (Seguimiento de pila en la parte inferior).

Mis páginas MVC para crear y editar mi Modelo de configuración arrojan el error. Esto comenzó a suceder cuando actualizamos a la versión de lanzamiento de S # arp Architecture 1.0. Mi clase tiene algunas listas como propiedades. Una de las listas contiene clases con otra otra lista como propiedad. No estoy seguro de qué lista arroja el error. ¿Alguien puede proporcionar instrucciones sobre cómo solucionar este problema o las cosas que deben buscarse en mis modelos que puedan causarlo?

Esta es mi clase de 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;
  }

 }

Este es el método SharpArchitecture que arroja el error:

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

Aquí está el seguimiento de la pila:

[InvalidOperationException: se modificó la colección; la operación de enumeración puede no ejecutarse.]    System.ThrowHelper.ThrowInvalidOperationException (recurso ExceptionResource) +51    System.Collections.Generic.Enumerator.MoveNextRare () +7661017    System.Collections.Generic.Enumerator.MoveNext () +61    SharpArch.Web.ModelBinder.SharpModelBinder.SetEntityCollectionProperty (ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, Object value) +358    SharpArch.Web.ModelBinder.SharpModelBinder.SetProperty (ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, Valor del objeto) +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, Modelo de objetos) +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, Tipo 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, Modelo de objetos) +293    System.Web.Mvc.DefaultModelBinder.BindComplexModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +772    System.Web.Mvc.DefaultModelBinder.BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +345

¿Fue útil?

Solución

Parece haber un error en el método SetEntityCollectionProperty de arquitectura nítida. Está en las últimas cuatro líneas:

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

Su intención parece ser llenar la clase de colección de modelo (entityCollection) a partir de los valores en el IEnumerable pasado como valor. Sin embargo, estos dos objetos son la misma referencia. Ya está poblado. Cuando el " Añadir " se invoca el método, se modifica entityCollection, que es el mismo objeto que se está iterando. Luego se lanza la excepción.

Comente o elimine ese bloque de código y su código debería ejecutarse.

Otros consejos

¿El comentario de este bloque de código afecta a otras funciones de S # arp?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top