C# 实体框架:跟踪EntityCollection中的集合更改

C# 实体框架:跟踪EntityCollection中的集合更改,c#,wpf,entity-framework,mvvm,entitycollection,C#,Wpf,Entity Framework,Mvvm,Entitycollection,我使用的是实体框架6,启用了更改跟踪和延迟加载,所有属性都是虚拟的,以提高更改跟踪性能(通过使用自跟踪实体),因此默认情况下,EF创建一个EntityCollection,以包含实体的导航属性列表 但是,EntityCollection没有实现INotifyCollectionChanged,因此我无法向CollectionChanged事件添加处理程序,这正是我想要实现的 具体来说,我想在集合更改时更改另一个属性(即添加或删除项目) 导航属性被定义为一个ICollection,我不会初始化为一

我使用的是实体框架6,启用了更改跟踪和延迟加载,所有属性都是虚拟的,以提高更改跟踪性能(通过使用自跟踪实体),因此默认情况下,EF创建一个
EntityCollection
,以包含实体的导航属性列表

但是,
EntityCollection
没有实现
INotifyCollectionChanged
,因此我无法向
CollectionChanged
事件添加处理程序,这正是我想要实现的

具体来说,我想在集合更改时更改另一个属性(即添加或删除项目)

导航属性被定义为一个
ICollection
,我不会初始化为一个值(例如,如果我试图将导航属性实例化为一个
ObservableCollection
,EF会通过创建一个新的
EntityCollection
自行处理它)

我还尝试创建
EntityCollection
的扩展,如:

public class ObservableEntityCollection<TEntity> : EntityCollection<TEntity>,  INotifyCollectionChanged where TEntity : class { ... }
然而,前面提到的方法不是虚拟的,所以我不能真正覆盖它们(也不能隐藏它们,我不相信它会起作用)

我还知道,在mvvm模式中为模型使用POCO对象并不是最好的解决方案,但这不是问题的范围


提前感谢您的帮助。

您可以将导航属性的集合类型更改为受支持的类型,也可以从头开始实现ICollection。EF将在加载过程中创建正确的集合,您可以按自己喜欢的方式观察集合。@bubi那么您建议在所有导航属性定义中将ICollection更改为ObservableCollection?编辑:如果我这样做,我就失去了自跟踪属性的好处:DetectChanges方法检查所有实体,而不是将更改存储在代理上。您可以将导航属性的集合类型更改为受支持的类型,也可以从头实现ICollection。EF将在加载过程中创建正确的集合,您可以按自己喜欢的方式观察集合。@bubi那么您建议在所有导航属性定义中将ICollection更改为ObservableCollection?编辑:如果这样做,我就失去了自跟踪属性的好处:DetectChanges方法检查所有实体,而不是将更改存储在代理上。
public override void Add(TEntity item)
   {
       base.Add(item);
       OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
   }