私が見つけたすべての例は、CTP5 には存在しないように見える ObjectContext というクラスを参照しています。この時点で強調しなければならないのは、CTP5 が Entity Framework に初めて触れたことです。
DbContext にアタッチした切断された POCO があります。ただし、SaveChanges は変更を取得しません。そのエンティティを更新するようにコンテキストに指示するにはどうすればよいですか?
_context.Users.Attach(user);
// The user has been replaced.
_context.SaveChanges();
// The change is not saved.
私は何を間違っていますか?
2011 年 12 月 1 日更新
ほとんどの人にとって明らかかもしれませんが、EF を初めて使用するユーザーとして、既にアタッチされているオブジェクトをアタッチすると以前の状態がクリアされるとは思いもしませんでした。これは私に多くの痛みを引き起こしました。しかし、オブジェクトが既にアタッチされているか、ASP.NET MVC バインディングの結果として新たに作成されたかを気にしない方法で、非常に一般的な方法でリポジトリ パターンを使用したかったのです。そのため、メソッドが必要だったので、UpdateUser
以下に添付しました。
public User UpdateUser(User user) {
if (_context.Entry(user).State == EntityState.Detached) {
_context.Users.Attach(user);
_context.Entry(user).State = EntityState.Modified;
}
return user;
}
メソッドは明らかに、オブジェクトが何らかの形でデータ ストアに存在することを前提としていますUpdateUser
。オブジェクトが既にアタッチされている場合は、オブジェクトの以前の状態を利用できるため、DB への最適化された更新が可能になります。ただし、オブジェクトがアタッチされていない場合、メソッドは全体を強制的にダーティにします。
今では明らかなようですが、以前はそうではありませんでした。それが誰かを助けることを願っています。
リッチ