3

コントローラー アクションでエンティティ プロパティが変更され、Update/SaveChanges が呼び出されない場合、そのエンティティは自動的に更新されますか?

リポジトリ パターンで EF 4.1 を使用しています。EfRepository クラスですべての CRUD 操作を次のように処理します。

public void Update(T entity)
{
  try{_context.SaveChanges();}
  catch{//do stuff}
}

//etc.

私のアプリケーションでは、データベースからエンティティを取得し、いくつかの基本的な計算を実行し、JSON オブジェクトを返す ajax/ActionResult 呼び出しがあります。簡単に言うと、ActionResult で使用していた静的ヘルパーにバグが見つかりました。これは、返された JSON モデルではなく、エンティティのプロパティ値を変更していました。

私のアクション メソッドには Update メソッドがありませんが、このアクションを呼び出すたびにエンティティが更新されていました。Sql Profiler を使用して、エンティティを更新するように調整された更新ステートメントと、バグのある静的メソッドが変更されていた 1 つのプロパティを確認しました。

リポジトリ クラスの Update メソッドにブレーク ポイントを配置しました。エンティティが EF によって更新されていたにもかかわらず、MY Update メソッドが呼び出されませんでした。IDbSet のインターフェイス メソッド 'Find' (私が使用するもの) の概要には、次のように書かれています。

指定された主キー値を持つエンティティを検索します。指定された主キー値を持つエンティティがコンテキスト内に存在する場合、ストアへのリクエストを行わずにすぐに返されます。それ以外の場合、指定された主キー値を持つエンティティのストアへのリクエストが行われ、このエンティティが見つかった場合は、コンテキストに関連付けられて返されます。コンテキストまたはストアでエンティティが見つからない場合は、null が返されます。

ここにも本当に良い例がいくつかあります。

私のエンティティが添付されていることを考えると、私の質問に対する簡単な答えは「はい」です。しかし、EF に少し慣れていないので、これを把握するのが非常に難しいバグであることがわかりました。これは、追跡できなかったカバーの下でいくつかのことが起こっているように見えるからです。私はこれを質問として投稿するのをためらっていましたが、より知識のある誰かが私の仮定のYESの答えを拡張し、最低限これに出くわした他の誰かを助けることができると思いました.

4

1 に答える 1

8

コントローラアクションでエンティティのプロパティが変更され、Update / SaveChangesが呼び出されない場合、そのエンティティは自動的に更新されますか?

いいえ、efはSaveChanges呼び出しでのみデータベースに変更を伝播します。保存は手動でのみ行われます(つまり、SaveChangesを明示的に呼び出す必要があります)。

ただし、理解することが非常に重要なのは、SaveChangesが現在のすべての変更をコンテキストに保存することです。これは、コンテキストを共有している場合、(あなただけでなく)誰かがSaveChangesを呼び出したときに、変更が保存されることを意味します。

于 2012-06-18T22:33:33.653 に答える