我有一个类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.InternalSet1.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基于某种原因并不喜欢这些事件。 当我拯救公司时,他们不会被解雇,顺便说一句。
我很困惑..知道可能导致这种情况的原因吗?