संक्षेप में, अपवाद को पोस्टिंग आवरण मॉडल के दौरान फेंक दिया गया है और एक प्रविष्टि की स्थिति को 'संशोधित' में बदल दिया गया है। राज्य को बदलने से पहले, राज्य को 'अलग' कर दिया जाता है, लेकिन अटैच () कॉलिंग उसी त्रुटि को फेंक देती है। मैं 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;
अपवाद फेंकता है:
'ए' प्रकार की इकाई को संलग्न करना विफल रहा क्योंकि उसी प्रकार की एक अन्य इकाई में पहले से ही समान प्राथमिक कुंजी है। ऐसा तब हो सकता है जब 'अटैच' पद्धति का उपयोग करते हुए या इकाई की स्थिति को 'अपरिवर्तित' या 'संशोधित' करने के लिए सेट किया जाता है यदि ग्राफ़ में किसी भी संस्था के पास महत्वपूर्ण मान हैं। ऐसा इसलिए हो सकता है क्योंकि कुछ इकाइयाँ नई हैं और अभी तक डेटाबेस-जनित प्रमुख मान प्राप्त नहीं हुए हैं। इस स्थिति में ग्राफ़ को ट्रैक करने के लिए 'ऐड' पद्धति या 'एडेड' एंटिटी स्टेट का उपयोग करें और फिर गैर-नई संस्थाओं की स्थिति को 'अपरिवर्तित' या 'संशोधित' के रूप में सेट करें।
क्या किसी को मेरे कोड में कुछ भी गलत दिखता है या यह समझ में आता है कि किसी मॉडल को संपादित करने के दौरान वह किन परिस्थितियों में ऐसी त्रुटि करेगा?
db
आपके दो कार्यों के बीच उदाहरण समान है, तो यह आपकी समस्या की व्याख्या कर सकता है, क्योंकि आपका आइटम GET विधि द्वारा लोड किया गया है (तब संदर्भ द्वारा ट्रैक किया गया है), और यह आपके POST पद्धति में किसी को पहचान नहीं सकता है क्योंकि इकाई पहले प्राप्त हुई थी ।
canUserAccessA()
इकाई को सीधे लोड करता है या किसी अन्य एंटिटी के संबंध के रूप में?
EntityState
? जैसा कि आपकी इकाई पोस्ट अनुरोध से आती है, इसे वर्तमान संदर्भ द्वारा ट्रैक नहीं किया जाना चाहिए, मुझे लगता है कि यह मानता है कि आप मौजूदा आईडी के साथ एक आइटम जोड़ने की कोशिश करते हैं