尝试在实体框架中更新实体时出现多个对象状态管理器错误
本文关键字:实体 对象 状态 管理器 错误 框架 更新 | 更新日期: 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);
区别在于本地。