EntityFramework Удаление объектов при наблюдении за изменениями коллекций и свойств - PullRequest
0 голосов
/ 20 июня 2011

У меня есть класс 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, теперь запускаются.

1 Ответ

0 голосов
/ 20 июня 2011

Я могу быть далеко, но что, если вы попробуете ниже?

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