2012-01-31 22 views
7

最近、MVVM WPFアプリケーションで多数のEntity Frameworkを使用していましたが、いくつかの問題が発生しました。データを表示するために、私のビューモデルは短命のObjectContextを使用しています。これらのビューモデルは長時間実行されるプロセスで使用されるため、短命なObjectContextを使用してパフォーマンスを低下させないことを推奨します。エンティティの再接続時にEntity Frameworkがコレクションの変更を追跡しない

したがって、基本的には、エンティティが切断モードで消費されていることを意味します。これらのエントリーは、作成、閲覧、更新、削除することができます。私は、切断されたモードを使用してデータベースに変更を保存しても問題ありませんでした。しかし、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は、単にエンティティを再び取り付ける際に、変更のこの種を追跡することができないのですか?

答えて

8

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

デタッチされたシナリオでリレーションを変更するときは、EFに手動でエンティティをアタッチしたときに変更されたリレーションを教えてください。これらの情報を提供するいくつかのカスタムロジックを作成し、ObjectStateManagerを使用してすべてのリレーションの状態を構成するか、またはデータベースからのリレーションシップで現在のバージョンを読み込み、切り離されたバージョンからロードされた添付バージョンに手動で変更を同期させることができます。

Btw。私はMVVMを一度も使用していないので、MVPの場合はMVPの場合は、単一の操作で使用すると長いライブコンテキストを使用できます。たとえば、編集ビューは独自のプレゼンターによって処理されます。このコンテキストは、エンティティをロードするために使用される単一のエンティティ/集合体を編集するためにビューが使用される限り存続し、同じコンテキストがエンティティを保存するために使用される。この場合、編集は同じ実行コンテキストによって実行され、単一の作業単位。

+0

本当に興味深いケースです。現在、EFがこれらの変更を更新しないという事実は、ナビゲーションプロパティのエンティティも別のエンティティによって参照されるため意味があります。新しいエンティティが作成されても、削除時に並行性の問題が発生する場合は問題ありません。 私のアーキテクチャでは、各MVVMはCRUDパラダイムの単一の責任として扱います。私はVMを接続モードに移行しました(私のアーキテクチャでは処分プロセスは箱詰めに処理されています)、メモリプロファイリングでは今のところ明らかになっていません。時間は分かりますが、実際には切断モードに戻るのはかなり簡単です。ご協力いただきありがとうございます。 – Ucodia

関連する問題