4

次のようにEntity Frameworkを使用してループ内のレコードを更新しようとしています:

var data = userDetails.users.Where(x => x.IsAnonymous == true);

foreach(var item in data)  
{
    var updatedData = db.Users.FirstOrDefault(x => x.UserId == item.UserId);
    updatedData.IsAnonymous = true;
    db.Users.Attach(updatedData);
    db.ObjectStateManager.ChangeObjectState(updatedData, EntityState.Modified);
    db.SaveChanges();     
}

( ) を添付中db.Users.Attach(updatedData);に例外が発生しました

オブジェクトは既にオブジェクト コンテキスト内にあるため、アタッチできません。オブジェクトは、変更されていない状態にある場合にのみ再接続できます

このエラーを解決するにはどうすればよいですか?

4

1 に答える 1

5

これが単一のDbContext(またはObjectContext) のコンテキストですべて発生する場合は、レコードを選択し、必要なフィールドを更新して続行します。すべてのレコードを更新したら、一度呼び出します.SaveChanges()Attachまたはコールの必要はありませんChangeObjectState.....

var data = userDetails.users.Where(x => x.IsAnonymous == true);

foreach(var item in data)  
{
    var updatedData = db.Users.FirstOrDefault(x => x.UserId == item.UserId);

    if(updatedData != null)
    {
        updatedData.IsAnonymous = true;
    }
}

db.SaveChanges();     

データ セットから選択updatedDataしたばかりなのでdb.Users、それは既にオブジェクト セットの一部になっているため、再度アタッチする必要はありません。必要なものを更新して呼び出すだけです.SaveChanges()(できればバッチ全体で1回-レコードごとに1回ではありません...)

于 2013-04-30T17:15:29.753 に答える