исключение в заданном методе - PullRequest
1 голос
/ 05 мая 2011

Когда я обновляю элемент, используя этот метод, я получаю исключение:

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); присоединяет элемент из БД, а когда я присоединяю обновленную сущность, он говорит, что есть прикрепленный элемент с тем же идентификатором.
Как я могу решить эту проблему, чтобы метод обновился?

1 Ответ

1 голос
/ 05 мая 2011

Фелипе Лима пишет в своей статье :

Всегда присоединяйте все свои сущности перед выполнением любой операции / запроса в вашем 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...