私は、エンティティ操作をラップするEntityService
クラスを持ち、WPFアプリケーションObservableCollection
のマテリアライズされたエンティティを提供しています。 EntityFrameworkコレクションとプロパティの変更を観察しながらオブジェクトを削除する
私はBooks
の私のコレクションから書籍を削除するには来
<Class EntityService>
public void DeleteBook(Book book)
{
context.DeleteObject(book)
observableCollectionOfBooks.Remove(book)
}
EntityFramework
はその後PropertyChanged
イベントをオフ発射-削除するブックのすべてのナビゲーションプロパティをnullに進みます。ここで
<Class LibraryViewModel>
private void BookPropertyChanged(object sender, PropertyChangedEventArgs e)
{
//Get all materialized books
var books = entityService.Books.Where(x => x.Author.Name == "Dan");
}
は私がNullReferenceException
削除帳がBook
に-削除するために、まだObservableCollection
とAuthor
から削除されていないためであるnull
を取得:私のviewmodelsの一つは、このイベントのオブザーバーです。
私はDeleteBook(Book book)
で操作の順序を変更しようとしましたが、異なるが関連する不一致が生じます。
問題は、操作がアトミックではないことです。
BookPropertyChanged
モデルが一貫性のある状態のときにのみ呼び出されます。Book
が削除され、ObservableCollection
に削除されたオブジェクトが含まれていません。
nullをチェックするなどの問題を解決するためにいくつかのハッキングがあるかもしれないが、もっと良い方法があるかどうか疑問に思っていましたか?
私は両方の操作が完了するまで何らかの形でイベントを抑制することを考えていました。 Iこれも理論的にはうまくいくかどうかはわかりませんが、私は、私は次のように相当な何かを達成する必要があると思う:
using (new EventSuppressor(book, observableCollectionOfBooks))
{
context.DeleteObject(book)
observableCollectionOfBooks.Remove(book)
}
そこでここでは、EventSuppressorのコンストラクタに渡されたオブジェクトは、イベント通知が抑制され、キャッシュされているだろうアップ。使用ブロック内の操作が実行されます。サプレッサーが配置されると、使用ブロックで実行された操作のために起動されたすべてのイベントが起動されます。
PropertyChangedEventを発生させるのはDeleteObjectであるため、これは何の違いもありません。私が本当に必要とするのは、イベントが発生する前に、DeleteObjectとObservableCollection.Removeの両方をexectすることです。このようにして、モデルとオブジェクトグラフは、アプリケーション層が期待するように一貫しています。 – djskinner