質問

SharpArchitectureモデルバインダーからエラーが表示されます。 "コレクションが変更されました;列挙操作が実行されない可能性があります。 (下部のスタックトレース)。

SettingsModel を作成および編集するMVCページでエラーがスローされます。これは、S#arp Architecture 1.0のリリースバージョンにアップグレードしたときに起こりました。私のクラスにはプロパティとしていくつかのリストがあります。リストの1つには、他のリストをプロパティとして持つクラスが含まれます。どのリストがエラーをスローしているかわかりません。誰もこれをトラブルシューティングする方法や、それを引き起こす可能性のあるモデルで探すべきことについて指示を与えることができますか?

これは私の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;
  }

 }

これは、エラーをスローするSharpArchitectureメソッドです:

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

スタックトレースは次のとおりです。

[InvalidOperationException:コレクションが変更されました。列挙操作が実行されない場合があります。]    System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)+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、Object value)+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、Object model)+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、Object model)+293    System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext、ModelBindingContext bindingContext)+772    System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext、ModelBindingContext bindingContext)+345

役に立ちましたか?

解決

シャープなアーキテクチャのSetEntityCollectionPropertyメソッドにはバグがあるようです。最後の4行に:

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

その目的は、値として渡されたIEnumerableの値からモデルコレクションクラス(entityCollection)を生成することです。ただし、これら2つのオブジェクトは同じ参照です。すでに入力されています。 「追加」がメソッドが呼び出され、entityCollectionが変更されます。これは、反復されているのと同じオブジェクトです。その後、例外がスローされます。

そのコードブロックをコメントまたは削除すると、コードが実行されます。

他のヒント

このコードブロックをコメントすると、S#arpの他の機能に影響しますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top