Question

Je reçois une erreur du classeur modèle SharpArchitecture. "La collection a été modifiée; l'opération d'énumération ne peut pas être exécutée. " (Trace de pile en bas).

Mes pages MVC pour créer et modifier mes modèles de configuration génèrent l'erreur. Cela a commencé lorsque nous avons mis à niveau la version finale de S # arp Architecture 1.0. Ma classe a quelques listes en tant que propriétés. Une des listes contient des classes avec une autre liste en tant que propriété. Je ne suis pas sûr de la liste qui lance l'erreur. Quelqu'un peut-il indiquer comment résoudre ce problème ou les éléments à rechercher dans mes modèles qui pourraient en être la cause?

Voici ma 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;
  }

 }

C’est la méthode SharpArchitecture qui génère l’erreur:

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

Voici la trace de la pile:

[InvalidOperationException: la collection a été modifiée; l'opération d'énumération peut ne pas s'exécuter.]    System.ThrowHelper.ThrowInvalidOperationException (ressource ExceptionResource) +51    System.Collections.Generic.Enumerator.MoveNextRare () +7661017    System.Collections.Generic.Enumerator.MoveNext () +61    SharpArch.Web.ModelBinder.SharpModelBinder.SetEntityCollectionProperty (ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, Valeur de l'objet) +358    SharpArch.Web.ModelBinder.SharpModelBinder.SetProperty (ControlContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, Valeur de l'objet) +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.BindComplexElmentalModel (ControllerContext controllerContext, ModelBindingContext bindingContext, Modèle d'objet) +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.BindComplexElmentalModel (ControllerContext controllerContext, ModelBindingContext bindingContext, Modèle d'objet) +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.ControllerActionInvoker.GetParameterValue (ControllerContext controllerContext, ParameterDescriptor paramètreDescriptor) +219    System.Web.Mvc.ControllerActionInvoker.GetParameterValues ??(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +109    System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName) +399    System.Web.Mvc.Controller.ExecuteCore () +126    System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext) +27    System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute (RequestContext requestContext) +7    System.Web.Mvc.MvcHandler.ProcessRequest (HttpContextBase httpContext) +151    System.Web.Mvc.MvcHandler.ProcessRequest (HttpContext httpContext) +57    System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest (HttpContext httpContext) +7    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +181    System.Web.HttpApplication.ExecuteStep (étape IExecutionStep, Boolean & complété; Synchrone) +75

Était-ce utile?

La solution

Il semble y avoir un bogue dans la méthode d'architecture pointue SetEntityCollectionProperty. C'est dans les quatre dernières lignes:

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

Son objectif semble être de renseigner la classe de collection de modèles (entityCollection) à partir des valeurs de IEnumerable transmises en tant que valeur. Cependant, ces deux objets sont la même référence. C'est déjà peuplé. Lorsque le " Ajouter " Lorsque la méthode est invoquée, la structure entityCollection est modifiée, ce qui correspond au même objet itéré. Ensuite, l'exception est levée.

Commentez ou supprimez ce bloc de code et votre code devrait être exécuté.

Autres conseils

Commentez-vous que ce bloc de code affecte les autres fonctions de S # arp?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top