DBから「プル」されたことがないエンティティをアタッチして、既存の行を更新させようとしています。たとえば、MVC(変更済み)で完全なモデルを渡し、ラウンドトリップなしでモデルを保存して、最初にエンティティを取得してから編集しようとしています。これは、前の呼び出しからの情報がすでにあるためです。
私が持っているのはこれです:
public static int ModifyExistingEntity<T>(this DbContext db, T updated) where T : class
{
DbSet<T> set = db.Set<T>();
set.Attach(updated);
db.Entry(updated).State = EntityState.Modified;
return db.SaveChanges();
}
しかし、私がそれを実行すると、私はこれを取得します:
System.Data.Entity.Infrastructure.DbUpdateConcurrencyException:ストアの更新、挿入、または削除ステートメントが予期しない行数(0)に影響しました。エンティティがロードされてから、エンティティが変更または削除された可能性があります。ObjectStateManagerエントリを更新します。---> System.Data.OptimisticConcurrencyException:ストアの更新、挿入、または削除ステートメントが予期しない行数(0)に影響しました。エンティティがロードされてから、エンティティが変更または削除された可能性があります。ObjectStateManagerエントリを更新します。
つまり、何も更新されていません。ここで何が欠けていますか?主キーは正しく設定されていますが、エンティティはDBからプルされておらず、以前に照会された情報と更新から構築されていることに注意してください。