【问题标题】:EF6 Cannot Delete/Update - An object with the same key already exists in the ObjectStateManagerEF6 无法删除/更新 - ObjectStateManager 中已存在具有相同键的对象
【发布时间】:2014-07-07 03:41:07
【问题描述】:

我使用的是 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;
    }

【问题讨论】:

    标签: entity-framework ef-code-first


    【解决方案1】:

    如果电话无效且具有 id,您可以尝试通过两种方式将其添加到上下文中:

    删除时:

      _db.Entry(deletePhone).State = EntityState.Deleted;
    

    此外,在检查它是否是新的时,您可以添加或更新它。这就是问题所在。

    因此,您需要做的是将添加或更新部分包装在 else 中,仅在手机未被删除时添加或更新。

    【讨论】:

      【解决方案2】:

      这并不是一个真正的逻辑问题,正在更新的手机与正在删除的手机完全不同。问题出在对象状态管理器中。因为我是在删除中这样做的

      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;
      

      【讨论】:

        猜你喜欢
        • 2011-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-28
        相关资源
        最近更新 更多