0

我有一个EntityService类,它实现了实体操作,还提供了物化实体的WPF应用程序ObservableCollectionEntityFramework在观察集合和属性更改时删除对象

当我来到从我收集的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为待删除的删除Booknull

我试过改变DeleteBook(Book book)中的操作顺序,但它会产生不同但相关的不一致。

问题是操作不是原子的。

我在寻找的是BookPropertyChanged仅当模型处于一致状态时才被调用:Book已删除且ObservableCollection未包含已删除的对象。

我意识到可能会有一些解决此问题的方法,比如检查空值,但我想知道是否有更好的方法?

我想在某种程度上压制事件,直到两个操作完成。我不知道如何做到这一点的工作,甚至在理论上,而且我觉得我需要实现的东西等同于以下:

using (new EventSuppressor(book, observableCollectionOfBooks)) 
{ 
    context.DeleteObject(book) 
    observableCollectionOfBooks.Remove(book) 
} 

所以在这里,传递到EventSuppressor构造会有任何对象的事件通知抑制和缓存向上。使用块内的操作可以发生。当抑制器被处置时,由于在使用块中执行的操作而将被触发的所有事件现在被触发。

回答

0

我可能会离开,但是,如果您尝试下面的内容呢?

public void DeleteBook(Book book) 
{ 
    context.DeleteObject(book); 
    context.SaveChanges(); 
    observableCollectionOfBooks.Remove(book); 
} 
+0

这不会有什么区别,因为它是引发PropertyChangedEvent的DeleteObject。我真正需要的是在触发任何事件之前,DeleteObject和ObservableCollection.Remove都被执行。这样,模型和对象图将与应用程序层期望的一致。 – djskinner