สรุปได้ว่ามีข้อยกเว้นเกิดขึ้นระหว่างการโพสต์โมเดล wrapper และเปลี่ยนสถานะของรายการหนึ่งเป็น 'Modified' ก่อนที่จะเปลี่ยนสถานะสถานะจะถูกตั้งค่าเป็น 'แยกออก' แต่การเรียก 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()
โหลดกิจการโดยตรงหรือเป็นความสัมพันธ์ของ entitiy อีกหรือไม่?
EntityState
หรือไม่ เนื่องจากเอนทิตีของคุณมาจากคำขอโพสต์จึงไม่ควรติดตามโดยบริบทปัจจุบันฉันเดาว่า บริษัท พิจารณาว่าคุณพยายามเพิ่มรายการที่มี ID ที่มีอยู่