EntityFramework在观察集合和属性更改时删除对象

时间:2011-06-20 11:00:20

标签: wpf entity-framework event-handling observablecollection

我有一个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中的操作顺序,但会产生不同但相关的不一致。

问题在于操作不是原子操作。

我正在寻找的只有当模型处于一致状态时才会调用nullDeleteBook(Book book)已删除且BookPropertyChanged不包含已删除对象

我意识到可能有一些黑客来解决这个问题,例如检查空值但是我想知道是否有更好的方法?

我想在某种程度上抑制事件直到两个操作完成。我不确定这在理论上是如何工作的,但我认为我需要实现与以下相同的东西:

Book

所以在这里,传递给EventSuppressor构造函数的任何对象都会抑制和缓存它们的事件通知。可以进行使用块内的操作。当处理抑制器时,现在会触发因使用块中执行的操作而触发的所有事件。

1 个答案:

答案 0 :(得分:0)

我可能会离开,但是,如果你尝试以下怎么办?

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