我有一个EntityService
类,它包含了实体操作,还提供了物化实体的WPF应用程序ObservableCollection
。
当我从Books
:
<Class EntityService>
public void DeleteBook(Book book)
{
context.DeleteObject(book)
observableCollectionOfBooks.Remove(book)
}
EntityFramework
然后将所有要删除的Book的导航属性设为null,从而触发PropertyChanged
个事件。我的一个ViewModel是此事件的观察者:
<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
的{{1}}为{ {1}}。
我已尝试更改Book
中的操作顺序,但会产生不同但相关的不一致。
问题在于操作不是原子操作。
我正在寻找的只有当模型处于一致状态时才会调用null
:DeleteBook(Book book)
已删除且BookPropertyChanged
不包含已删除对象
我意识到可能有一些黑客来解决这个问题,例如检查空值但是我想知道是否有更好的方法?
我想在某种程度上抑制事件直到两个操作完成。我不确定这在理论上是如何工作的,但我认为我需要实现与以下相同的东西:
Book
所以在这里,传递给EventSuppressor构造函数的任何对象都会抑制和缓存它们的事件通知。可以进行使用块内的操作。当处理抑制器时,现在会触发因使用块中执行的操作而触发的所有事件。
答案 0 :(得分:0)
我可能会离开,但是,如果你尝试以下怎么办?
public void DeleteBook(Book book)
{
context.DeleteObject(book);
context.SaveChanges();
observableCollectionOfBooks.Remove(book);
}