我有一個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