1

我正在使用启用了更改跟踪和延迟加载的实体框架 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 对象并不是最好的解决方案,但这不是问题的范围。

在此先感谢您的帮助。

4

0 回答 0