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