0

私は、エンティティ操作をラップする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に-削除するために、まだObservableCollectionAuthorから削除されていないためであるnullを取得:私のviewmodelsの一つは、このイベントのオブザーバーです。

私はDeleteBook(Book book)で操作の順序を変更しようとしましたが、異なるが関連する不一致が生じます。

問題は、操作がアトミックではないことです。

BookPropertyChangedモデルが一貫性のある状態のときにのみ呼び出されます。Bookが削除され、ObservableCollectionに削除されたオブジェクトが含まれていません。

nullをチェックするなどの問題を解決するためにいくつかのハッキングがあるかもしれないが、もっと良い方法があるかどうか疑問に思っていましたか?

私は両方の操作が完了するまで何らかの形でイベントを抑制することを考えていました。 Iこれも理論的にはうまくいくかどうかはわかりませんが、私は、私は次のように相当な何かを達成する必要があると思う:

using (new EventSuppressor(book, observableCollectionOfBooks)) 
{ 
    context.DeleteObject(book) 
    observableCollectionOfBooks.Remove(book) 
} 

そこでここでは、EventSuppressorのコンストラクタに渡されたオブジェクトは、イベント通知が抑制され、キャッシュされているだろうアップ。使用ブロック内の操作が実行されます。サプレッサーが配置されると、使用ブロックで実行された操作のために起動されたすべてのイベントが起動されます。

答えて

0

私は途方もないかもしれませんが、もしあなたが以下を試してみたらどうなりますか?

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

PropertyChangedEventを発生させるのはDeleteObjectであるため、これは何の違いもありません。私が本当に必要とするのは、イベントが発生する前に、DeleteObjectとObservableCollection.Removeの両方をexectすることです。このようにして、モデルとオブジェクトグラフは、アプリケーション層が期待するように一貫しています。 – djskinner

関連する問題