Error de enumeración de la carpeta del modelo de arquitectura S # arp
-
07-07-2019 - |
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
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?