我有一个EntityService
类,它实现了实体操作,还提供了物化实体的WPF应用程序ObservableCollection
。EntityFramework在观察集合和属性更改时删除对象
当我来到从我收集的Books
删除图书:
<Class EntityService>
public void DeleteBook(Book book)
{
context.DeleteObject(book)
observableCollectionOfBooks.Remove(book)
}
EntityFramework
然后继续空待删除的图书,其触发关闭PropertyChanged
事件的所有导航性能。我的一个的ViewModels的是本次活动的观察员:
<Class LibraryViewModel>
private void BookPropertyChanged(object sender, PropertyChangedEventArgs e)
{
//Get all materialized books
var books = entityService.Books.Where(x => x.Author.Name == "Dan");
}
在这里,我得到一个NullReferenceException
因为删除该书尚未从ObservableCollection
但和Author
为待删除的删除Book
是null
。
我试过改变DeleteBook(Book book)
中的操作顺序,但它会产生不同但相关的不一致。
问题是操作不是原子的。
我在寻找的是BookPropertyChanged
仅当模型处于一致状态时才被调用:Book
已删除且ObservableCollection
未包含已删除的对象。
我意识到可能会有一些解决此问题的方法,比如检查空值,但我想知道是否有更好的方法?
我想在某种程度上压制事件,直到两个操作完成。我不知道如何做到这一点的工作,甚至在理论上,而且我觉得我需要实现的东西等同于以下:
using (new EventSuppressor(book, observableCollectionOfBooks))
{
context.DeleteObject(book)
observableCollectionOfBooks.Remove(book)
}
所以在这里,传递到EventSuppressor构造会有任何对象的事件通知抑制和缓存向上。使用块内的操作可以发生。当抑制器被处置时,由于在使用块中执行的操作而将被触发的所有事件现在被触发。
这不会有什么区别,因为它是引发PropertyChangedEvent的DeleteObject。我真正需要的是在触发任何事件之前,DeleteObject和ObservableCollection.Remove都被执行。这样,模型和对象图将与应用程序层期望的一致。 – djskinner