У меня есть класс 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 по какой-то причине не любит события.
Когда я спасаю Компанию, их не увольняют, кстати.
Я в замешательстве .. Есть идеи, что может быть причиной этого?