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