尝试在实体框架中更新实体时出现多个对象状态管理器错误

本文关键字:实体 对象 状态 管理器 错误 框架 更新 | 更新日期: 2023-09-27 18:31:24

这是一个已经出现几个月的问题,并且被证明是非常令人沮丧的。

我有一个实体...存储合同...继承自合同;从 TPT(每种类型的表)关系创建(我不确定这是否有区别)。当我尝试通过将协定的更新定义传递给 Update 方法来更新现有的存储合同时......

    public StorageContract UpdateStorageContract(StorageContract contract)
    {
        Context.ObjectContext.ApplyCurrentValues("Contracts", contract);
        Context.SaveChanges();
        return contract;
    }

。我收到错误...

"An object with a key that matches the key of the supplied object could not be found in the ObjectStateManager"

我找到了以下帖子..."在对象状态管理器中找不到具有与所提供对象的键匹配的键的对象" ...这导致我尝试"附加"合约参数。

    public StorageContract UpdateStorageContract(StorageContract contract)
    {
        Context.ObjectContext.AttachTo("Contracts", contract);
        Context.SaveChanges();
        return contract;
    }

。这会导致一个错误,该错误似乎与以前的错误完全相反......

"An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key"

第一个错误表示无法更新实体,因为它找不到......其中似乎表明它无法更新,因为它已经存在(??无论如何,这让我想到了以下帖子..."具有相同键的对象已存在于 ObjectStateManager 中。ObjectStateManager 不能使用相同的键跟踪多个对象"。所以我基于此再次重新设计了代码......

    public StorageContract UpdateStorageContract(StorageContract contract)
    {
        var origEntry = Context.Entry<StorageContract>(contract);
        if (origEntry.State == System.Data.EntityState.Detached)
        {
            var set = Context.Set<StorageContract>();
            StorageContract attachedEntity = set.Find(contract.Id);
            if (attachedEntity != null)
            {
                var attachedEntry = Context.Entry(attachedEntity);
                attachedEntry.CurrentValues.SetValues(contract);
            }
            else
            {
                origEntry.State = System.Data.EntityState.Modified;
            }
        }
        Context.SaveChanges();
        return contract;
    }

这会导致相同的错误...

"An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key"

我正在追逐这个兔子洞,它处处塌陷!我迫切需要帮助!!

谢谢!

尝试在实体框架中更新实体时出现多个对象状态管理器错误

你介意试试这个吗:

var set = Context.Set<StorageContract>().Local;
StorageContract attachedEntity = set.Find(contract.Id);

区别在于本地。