我正在使用启用了更改跟踪和延迟加载的实体框架 6,所有属性都是虚拟的以提高更改跟踪性能(通过使用自我跟踪实体),因此默认情况下 EF 创建一个EntityCollection<TEntity>
包含实体的导航属性列表。
然而,事情是EntityCollection
没有实现INotifyCollectionChanged
的,所以我不能向CollectionChanged
事件添加处理程序,这是我想要实现的。
详细地说,我想在更改集合时更改另一个属性(即添加或删除项目)。
导航属性被定义为ICollection<TEntity>
,我没有将其初始化为一个值(EF 通过创建一个新的 来自行处理它,例如EntityCollection<TEntity>
,如果我尝试实例化导航属性,ObservableCollection<TEntity>
则会出现错误)。
我还尝试创建EntityCollection<TEntity>
类似的扩展:
public class ObservableEntityCollection<TEntity> : EntityCollection<TEntity>, INotifyCollectionChanged where TEntity : class { ... }
并像这样覆盖 Add、Remove 和 Clear 方法:
public override void Add(TEntity item)
{
base.Add(item);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
}
然而,上述方法不是虚拟的,所以我不能真正覆盖它们(也不能隐藏它们,我不相信它会起作用)。
我也知道在 mvvm 模式中为模型使用 POCO 对象并不是最好的解决方案,但这不是问题的范围。
在此先感谢您的帮助。