Entity Framework выдает «Коллекция была изменена» при использовании наблюдаемой коллекции - PullRequest
1 голос
/ 21 сентября 2011

У меня есть класс 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 () в System.Data.Entity.Internal.InternalContext.DetectChanges (Boolean сила) в 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)

Если я изменю ObservableList на List <> - это работает. Если я не подключаю события - это работает. Так что EF по какой-то причине не любит события. Когда я спасаю Компанию, их не увольняют, кстати.

Я в замешательстве .. Есть идеи, что может быть причиной этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...