В принципе, у меня есть таблица, которая содержит несколько свойств для компании. Это таблица "master", и их идентификатор используется во многих других таблицах. Я в основном нахожу их идентификатор с помощью этого метода:
private Company currentcompany()
{
Company cuco = db.Companies.Single(x => x.username == User.Identity.Name);
return cuco;
}
Мне нужно дать пользователям возможность обновлять различные данные о себе, хранящиеся в этой таблице, что я сделал отлично, однако я заметил большую дыру в безопасности!
Использование данных Tamper в Firefox (и я думаю, Fidler/многие другие), я мог бы легко изменить скрытый идентификатор и изменить другие данные компаний.
Чтобы остановить это, я добавил следующие строки в действие изменения:
Company cuco = currentcompany();
if (company.id != cuco.id)
{
return Content("Security Error");
}
(FYI - Company
- это модель /POCO, представляющая компанию, а сама Company
- это данные формы.)
После добавления этого, если я отредактирую идентификатор в данных формы, он работает как ожидалось и вызывает "Ошибка безопасности", однако, если нет ошибки, и я продолжаю, я получаю ошибку в вопросе.
"Объект с тем же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом.
Я считаю, что это потому, что EF каким-то образом обнаруживает и удерживает первые данные, но я просто не уверен, как их исправить.
Любые советы?
Edit- --update -
Если вы можете понять, чего я пытаюсь достичь, есть ли лучший способ обойти это?