4

我正在尝试使用这样的实体框架循环更新记录:

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()一次。不需要AttachChangeObjectState电话......

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();     

由于您刚刚updatedDatadb.Users数据集中选择 - 它已经是对象集的一部分 - 无需再次附加它!只需更新您需要的内容,然后调用.SaveChanges()(最好为整个批次调用一次 - 而不是每条记录一次......)

于 2013-04-30T17:15:29.753 回答