Erreur d'énumération du classeur de modèle d'architecture S # arp
-
07-07-2019 - |
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
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?