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