EF6无法删除/更新 - ObjectStateManager中已存在具有相同键的对象

时间:2014-07-04 02:39:30

标签: entity-framework ef-code-first

我正在使用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;
    }

2 个答案:

答案 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;