我正在使用EF 6 Code First,我需要删除一个项目,然后更新一个实体集合中的另一个项目。如果我尝试删除一个项目,然后修改一个完全不同的项目,我会得到错误消息" ObjectStateManage"中存在一个具有相同键的对象。这是不准确的,因为有两个具有完全不同的PK ID的对象,但是当更新发生时它会抛出错误。如果我注释掉要删除的代码,那么更新可以很好地处理多个要更新的项目。为什么会抱怨"相同的键"当钥匙不同时?
foreach (var phone in phones)
{
if (!_isValidPhone(phone))
{
if(phone.PhoneId != 0)
{
var deletePhone = _db.Phones.FirstOrDefault(r => r.PhoneId == phone.PhoneId);
_db.Entry(deletePhone).State = EntityState.Deleted;
continue;
}
}
if (_isNewPhone(phone))
{
AddNewPhone(phone, _person);
}
else
{
UpdatePhoneData(phone, _person.Phones.FirstOrDefault(r => r.Order == phone.Order));
}
}
private void UpdatePhoneData(Phone phoneFrom, Phone phoneTo)
{
phoneTo.Note = phoneFrom.Note;
phoneTo.PhoneNumber = phoneFrom.PhoneNumber;
phoneTo.Order = phoneFrom.Order;
_db.Entry(phoneTo).State = EntityState.Modified;
}
答案 0 :(得分:0)
如果手机无效且有ID,请尝试以两种方式将其添加到上下文中:
删除时:
_db.Entry(deletePhone).State = EntityState.Deleted;
此外,在检查是否是新内容时,您可以添加或更新它。这就是问题所在。
因此,您需要做的是将添加或更新部分包装在其他内容中,仅在手机尚未删除时添加或更新。
答案 1 :(得分:0)
这不是一个真正的逻辑问题,正在更新的手机与正在删除的手机完全不同。问题出在对象statemanager中。因为我在删除
中这样做了var deletePhone = _db.Phones.FirstOrDefault();
然后我有一个单独的电话列表,我尝试将其中一个设置为修改
_db.Entry(phoneTo).State = EntityState.Modified;
对象状态管理器现在基本上每个手机加载两次。因此,如果我只使用_person.Phones进行删除和修改,那么Phones列表只加载一次,现在有重复的键。
_db.Entry(_person.Phones.FirstOrDefault(r => r.PhoneId == phone.PhoneId)).State = EntityState.Deleted;