У меня есть класс EntityService
, который охватывает операции с сущностями, а также предоставляет приложению WPF ObservableCollection
материализованных сущностей.
Когда я прихожу, чтобы удалить Книгу из моей коллекции 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
для-be-delete Book
- это null
.
Я пытался изменить порядок операций в DeleteBook(Book book)
, но это вызывает другое, но связанное несоответствие.
Проблема в том, чтооперация не атомарная.
Я ищу, чтобы BookPropertyChanged
вызывался, только когда модель находится в согласованном состоянии: Book
удален, а ObservableCollection
- нетсодержат удаленный объект.
Я понимаю, что может быть какой-то взлом, чтобы исправить это, например, проверка на нулевые значения, но мне было интересно, есть ли лучший способ?
Я думал о том, чтобы как-то подавитьсобытия, пока обе операции не были завершены.Я не уверен, как это будет работать даже в теории, но я думаю, что мне нужно добиться чего-то эквивалентного следующему:
using (new EventSuppressor(book, observableCollectionOfBooks))
{
context.DeleteObject(book)
observableCollectionOfBooks.Remove(book)
}
Так что здесь, любые объекты, переданные в конструктор EventSuppressor, будут подавлять свои уведомления о событияхи кешировал.Операции внутри блока using могут выполняться.Когда подавитель удаляется, все события, которые были бы запущены из-за операций, выполненных в блоке using, теперь запускаются.