我正在尝试使用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);
)时,我得到了异常
无法附加对象,因为它已在对象上下文中。只有当对象处于未更改状态时才能重新附加对象
如何解决此错误?
答案 0 :(得分: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()
(最好是整个批次一次 - 不是每次记录一次......)