7

最近、MVVMWPFアプリケーションで多くのEntityFrameworkを使用していますが、いくつかの問題が発生しました。データを表示するために、私のビューモデルは短命のObjectContextを使用しています。これらのビューモデルは長時間実行されるプロセスで使用されるため、パフォーマンスを低下させないために、短命のObjectContextを使用することを選択しました。

つまり、基本的には、エンティティが切断モードで消費されていることを意味します。これらのエンティティは、作成、表示、更新、および削除できます。切断モードを使用して変更をデータベースに保存することに問題はありませんでした。SaveChanges()しかし、メソッドの呼び出し時にエラーが表示されずに変更が保存されない特定のケースを見つけました。これは、コレクションプロパティを持つエンティティを更新しようとすると発生します。エンティティのスカラープロパティは問題なく保持されますが、コレクションの変更は、再接続時にこれらの変更を追跡できなかった場合のように、データベースに反映されません。

これは、エンティティ名を変更してから、そのレポートコレクションにオブジェクトを追加する私の場合のサンプルコードです。の後SaveChanges()、クライアント名のみがデータベースに反映されます。

this.Client.Name = "Test Client";
this.Client.Reports.Add(new Report { Name = "Test Report" });

using (ReportCompositionEntities entities = new ReportCompositionEntities(this.connectionStringName))
{
    entities.Clients.ApplyCurrentValues(this.Client);
    entities.SaveChanges();
}

それで、私は何か間違ったことをしているのですか、それともEFはエンティティを再接続するときにこの種の変更を追跡できないのですか?

4

1 に答える 1

8

それがまさに起こることです。変更の追跡はなく、EFはナビゲーションプロパティで実行された変更を認識しません。またApplyCurrentValues、スカラープロパティと複雑なプロパティのみを処理できます。ナビゲーションプロパティではありません。

デタッチシナリオでリレーションを変更する場合は、エンティティをアタッチした後に変更されたリレーションをEFに手動で通知する必要があります。これらの情報を提供するカスタムロジックを作成しObjectStateManager、すべてのリレーションの状態を構成するために使用できます。または、データベースからリレーションを使用して現在のバージョンをロードし、デタッチバージョンからロードされたアタッチバージョンへの変更を手動で同期できます。

ところで。私はMVVMを使用したことがないので、この場合にどのように適用されるかはわかりませんが、MVPの場合、単一の操作に使用される場合は長寿命のコンテキストを使用できます-たとえば、編集ビューは独自のコンテキストを持つ独自のプレゼンターによって処理されます。このコンテキストは、ビューが単一のエンティティ/集計の編集に使用される限り存続します=エンティティの読み込みに使用され、エンティティの保存に同じコンテキストが使用されます。この場合、編集は同じ実行コンテキストによって実行され、に属します。単一の作業単位。

于 2012-01-31T09:17:10.597 に答える