当我使用此方法更新元素时,我得到了异常:
An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
这是方法:
public void Set(TaskPrice entity)
{
bool isExists = GetQuery().Any(x => x.TaskId == entity.TaskId);
if (isExists)
{
ObjectStateEntry entry=null;
if (this.Context.ObjectStateManager.TryGetObjectStateEntry(entity, out entry) == false)
{
this.ObjectSet.Attach(entity);
}
this.Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
}
else
{
this.ObjectSet.AddObject(entity);
}
}
我承认这个例外是因为GetQuery().Any(x => x.TaskId == entity.TaskId);
附加了来自db的元素,当我附加更新的实体时,它就是附加了具有相同id的元素。
如何解决此问题以便方法更新?
答案 0 :(得分:1)
Felipe Lima在他的article写道:
始终先附上您的所有实体 在你的任何操作/查询 ObjectContext的。这样,你就可以避免任何 双重跟踪请求。如果 ObjectContext稍后需要您的实体, 它会检索你的实例 之前附上,你很高兴去!
所以你的固定代码应该是:
public void Set(TaskPrice entity)
{
ObjectStateEntry entry=null;
if (this.Context.ObjectStateManager.TryGetObjectStateEntry(entity, out entry) == false)
{
this.ObjectSet.Attach(entity);
}
bool isExists = GetQuery().Any(x => x.TaskId == entity.TaskId);
if (isExists)
{
this.Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
}
else
{
this.ObjectSet.AddObject(entity);
}
}