Entity Framework Code First DBContext Ошибка ObjectStateManager - PullRequest
0 голосов
/ 16 июля 2011

Я получаю сообщение об ошибке "An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key."

public class TestObject
{
    public string Name {get;set;}
}


public EditTeamResponse Edit(TestObject testObject)
    {            
        if (!ValidateTestObject(testObject))
        {
            return testObject;
        }
        try
        {
            _unitOfWork.TestObjectRepository.Update(testObject);
            _unitOfWork.Commit();
        }
        catch (Exception)
        {
            //Error is thrown here
            _validationDictionary.AddError("Unknown", "Unknown Error!");
            return testObject;
        }
        // Other Extra Code
        return editTeamResponse;
    }

protected bool ValidateTestObject(TestObject testObject)
    {
        if (CheckIfNameChanged(teamToValidate))
        {
            if (_unitOfWork.TestObjectRepository.Any(x => x.Name == testObject.Name))
                _validationDictionary.AddError("Name", "Name already exist.");
        }
        return _validationDictionary.IsValid;
    }
private bool CheckIfNameChanged(TestObject testObject)
        {
            return _unitOfWork.TestObjectRepository.FindBy(testObject.TeamId).Name != testObject.Name;
        }

Я знаю, что когда я вызываю метод CheckIfNameChanged (TestObject testObject), я добавляю ключ объекта в ObjectContext и когда я присоединяю или редактирую код при вызове _unitOfWork.TestObjectRepository.Update (testObject):

public void Update{
    _context.Entry(entity).State = EntityState.Modified;
}

Это - то, где конфликт случается, и я получил два одинаковых ключа объекта в ObjectStateManager. Есть ли способ решить эту проблему без моего перехода в контекст, чтобы отделить сущность, или есть какой-то другой способ? И каков наилучший способ отделить сущность от контекста?

1 Ответ

1 голос
/ 16 июля 2011

Вы можете проверить, изменилось ли имя следующим образом

private bool CheckIfNameChanged(TestObject testObject)
{
    return !_unitOfWork.TestObjectRepository
       .Any(x => x.TeamId == testObject.TeamId && x.Name == testObject.Name);
}
...