В двух словах, исключение выдается во время POSTing модели оболочки и изменения состояния одной записи на «Изменено». Перед изменением состояния устанавливается состояние «Отсоединено», но вызов Attach () выдает ту же ошибку. Я использую EF6.
Пожалуйста, найдите мой код ниже (названия моделей были изменены, чтобы их было легче читать)
Модель
// Wrapper classes
public class AViewModel
{
public A a { get; set; }
public List<B> b { get; set; }
public C c { get; set; }
}
контроллер
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
if (!canUserAccessA(id.Value))
return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
var aViewModel = new AViewModel();
aViewModel.A = db.As.Find(id);
if (aViewModel.Receipt == null)
{
return HttpNotFound();
}
aViewModel.b = db.Bs.Where(x => x.aID == id.Value).ToList();
aViewModel.Vendor = db.Cs.Where(x => x.cID == aViewModel.a.cID).FirstOrDefault();
return View(aViewModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(AViewModel aViewModel)
{
if (!canUserAccessA(aViewModel.a.aID) || aViewModel.a.UserID != WebSecurity.GetUserId(User.Identity.Name))
return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
if (ModelState.IsValid)
{
db.Entry(aViewModel.a).State = EntityState.Modified; //THIS IS WHERE THE ERROR IS BEING THROWN
db.SaveChanges();
return RedirectToAction("Index");
}
return View(aViewModel);
}
Как показано в строке выше
db.Entry(aViewModel.a).State = EntityState.Modified;
выдает исключение:
Прикрепить объект типа «A» не удалось, поскольку другой объект того же типа уже имеет такое же значение первичного ключа. Это может произойти при использовании метода «Присоединить» или установке состояния объекта на «Неизменено» или «Изменено», если какие-либо объекты на графике имеют конфликтующие значения ключей. Это может быть связано с тем, что некоторые объекты являются новыми и еще не получили значения ключей, созданные базой данных. В этом случае используйте метод «Добавить» или «Добавленное» состояние объекта для отслеживания графа, а затем установите для состояния не новых объектов значение «Без изменений» или «Изменено» в зависимости от ситуации.
Кто-нибудь видит что-то не так в моем коде или понимает, при каких обстоятельствах он может выдать такую ошибку при редактировании модели?
dbэкземпляр одинаков для двух ваших действий, это может объяснить вашу проблему, поскольку ваш элемент загружается методом GET (затем отслеживается контекстом), и он может не распознать тот, который в вашем методе POST, как объект, полученный ранее ,
canUserAccessA()Загружает ли объект напрямую или как отношение другого объекта?
EntityState? Поскольку ваша сущность поступает из почтового запроса, она не должна отслеживаться текущим контекстом, я думаю, она считает, что вы пытаетесь добавить элемент с существующим идентификатором