Коротше кажучи, виняток закидається під час розгортання моделі обгортки та зміни стану одного запису на "Модифікований". Перед тим, як змінити стан, стан встановлено на "Детально", але виклик 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
? Оскільки ваша організація надходить із запиту на публікацію, її не слід відслідковувати за поточним контекстом, я думаю, що вона вважає, що ви намагаєтесь додати елемент із наявним ідентифікатором