set方法中的异常

时间:2011-05-05 12:41:45

标签: c# .net entity-framework

当我使用此方法更新元素时​​,我得到了异常:

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的元素。
如何解决此问题以便方法更新?

1 个答案:

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