使用可观察集合时,实体框架会抛出“已修改集合”

时间:2011-09-21 19:53:49

标签: c# entity-framework-4.1

我有一个类Employee和一个类Company,它包含一个(可观察的)员工列表。 可观察列表来自List<>,基本上如下所示:

public class ObservableList<T> : List<T>
{
   // declaration of delegates and events here
   new public virtual void Add(T item)
        {
            CollectionChangingEventArgs<T> e = new CollectionChangingEventArgs<T>(new T[] { item }, ObservableListChangeAction.Adding);
            OnAdding(e);
            if (e.CancelAction)
                return;

            base.Add(item);

            CollectionChangedEventArgs<T> ed = new CollectionChangedEventArgs<T>(new T[] { item }, ObservableListChangeAction.Added);
            OnAdded(ed);
        }
}

事件在公司构造函数中连线。 所以整个事情看起来大致如下:

public class Employee
    {
        // stuff here
    }

    public class Company
    {
        // stuff
        ObservableList<Employee> employees = new ObservableList<Employee>();
        public ObservableList<Employee> Employees { get { return this.employees; } }

        public Company()
        {
            Employees.Adding += new ObservableList<Employee>.CollectionChangingEventHandler(Employees_Adding);
        }

        void Employees_Adding(object sender, CollectionChangingEventArgs<Employee> e)
        {
            // do some checks.. none alter the collection
            *edit*
           // I have a line that does this:
           **employee.Employer = this;**
          //So if the employer was saved prior to this point, it errors out.
        }   
    }

现在,如果我这样做:

Company c = new Company();
Employee e = new Employee();
c.Employees.Adding(e);
c.Save();

它工作正常。

但是,如果我先保存员工,请执行以下操作:

   Company c = new Company();
    Employee e = new Employee();
    e.Save();
    c.Employees.Adding(e);
    c.Save();

然后EF抛出异常:集合被修改;枚举操作可能无法执行。

Save()方法来自基类,基本上是这样做的:

  this.dbContext.Set<T>().Add(instance);
  dbContext.SaveChanges();

这是一个堆栈跟踪:

  

在System.Collections.Generic.List 1.Enumerator.MoveNextRare() at System.Data.Objects.ObjectStateManager.PerformAdd(IList 1个条目)
  在System.Data.Objects.ObjectStateManager.DetectChanges()at   System.Data.Entity.Internal.InternalContext.DetectChanges(布尔   强迫)   System.Data.Entity.Internal.Linq.InternalSet 1.ActOnSet(Action action, EntityState newState, Object entity, String methodName) at System.Data.Entity.Internal.Linq.InternalSet 1.Add(Object entity)
  在System.Data.Entity.DbSet`1.Add(TEntity entity)

如果我将ObservableList更改为List&lt;&gt; - 有用。如果我不挂机事件 - 它有效。 所以基本上EF基于某种原因并不喜欢这些事件。 当我拯救公司时,他们不会被解雇,顺便说一句。

我很困惑..知道可能导致这种情况的原因吗?

0 个答案:

没有答案