0

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からプルされておらず、以前に照会された情報と更新から構築されていることに注意してください。

4

2 に答える 2

0

継承で試すことができる静的拡張に問題がある可能性があります。

public class MyContext:DbContext {

  public int ModifyExistingEntity<T>(this DbContext db, T updated) where T : class
  {
    DbSet<T> set = Set<T>();
    set.Attach(updated);
    this.Entry(updated).State = EntityState.Modified;
    return SaveChanges();
  }

}
于 2012-12-19T03:16:35.247 に答える
0
set.Attach(updated);

エンティティを変更されていない状態でコンテキストにアタッチしているため、上記の行は必要ありません。このようにアタッチすると、コンテキストによって追跡される元の値(db値)が更新された値の値に設定されるため、楽観的同時実行例外が発生している可能性があります。以下の行だけを使用すると、エンティティがコンテキストにアタッチされ、状態が設定されるため、機能するかどうかを確認してください。

db.Entry(updated).State = EntityState.Modified;

http://msdn.microsoft.com/en-us/data/jj592676.aspx

于 2012-12-20T07:47:13.970 に答える