例外:无法附加对象,因为它已在对象上下文中

时间:2013-04-30 17:06:21

标签: .net entity-framework

我正在尝试使用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);)时,我得到了异常

  

无法附加对象,因为它已在对象上下文中。只有当对象处于未更改状态时才能重新附加对象

如何解决此错误?

1 个答案:

答案 0 :(得分: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();     

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