2012-04-05 19 views
5

संशोधित करते हुए नए बाल वस्तु को जोड़ना मैंने इसी तरह के सवालों के कुछ जवाब देखे हैं और वे वास्तव में मेरे फिट नहीं लगते हैं।मौजूदा बाल इकाई फ्रेमवर्क

मैं एंटिटी फ्रेमवर्क: डीबीकॉन्टेक्स्ट (पृष्ठ 9 0) से एक पैटर्न को शामिल करने की कोशिश कर रहा हूं और यह काम नहीं कर रहा है। कोड है कि मैं उपयोग कर रहा हूँ नीचे दिया गया है

[HttpPost] 
public ActionResult Edit(Order order) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Orders.Add(order); 
     db.Entry(order).State = EntityState.Modified; 

     foreach (var orderDetail in order.OrderDetails) 
     { 
       if (orderDetail.OrderId == 0) 
       { 
        db.Entry(orderDetail).State = EntityState.Added; 
       } 
       else 
       { 
        db.Entry(orderDetail).State = EntityState.Modified; 
       } 
       // The example order that I'm updating has two child entities 
       // so this orderId will be for the third, added one. 
       int addedOrderDetailId = order.OrderDetails[2].OrderId; 
      } 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
    } 

    ViewBag.CustomerId = new SelectList(db.Customers, "CustomerId", "CompanyName", order.CustomerId); 

    return View(order); 

} 

मैं एक उदाहरण के बराबर चल रही है जहां आदेश वस्तु दो मौजूदा OrderDetail वस्तुएं हैं और मुझे एक तृतीय जोड़ने का प्रयास कर रहा हूँ। मैंने addODderDetailId वैरिएबल को शामिल किया है, ताकि मैं इसे 'वॉच' में जोड़ सकूं और देख सकूं कि यह कब बदल गया है

जो मैंने पाया है वह यह है कि जोड़ा गया ऑर्डरडेंट ऑब्जेक्ट का ऑर्डर आईडी (जो 0 है जब फोरच लूप दर्ज किया गया है) ऑर्डर ऑब्जेक्ट के ऑर्डरआईडी में इकाई फ्रेमवर्क द्वारा अपडेट किया जा रहा है। यह फ़ोरैच लूप के माध्यम से पहली पुनरावृत्ति के बाद हो रहा है (जब पहली बच्ची इकाई का राज्य बदल गया है। इसका मतलब है कि सभी तीन बच्चों को संशोधित के रूप में चिह्नित किया जा रहा है। इससे SaveChanges() को एक प्रविष्टि को अपडेट करने का प्रयास किया जा रहा है डेटाबेस में मौजूद नहीं है।

अगर किसी और को यह समस्या हो, तो मैं इस बारे में किसी भी सलाह के लिए बहुत अच्छा होगा। मुझे मौजूदा बाल वस्तुओं को हटाए जाने से भी निपटना होगा, लेकिन मैं अभी तक इस के लिए चारों ओर हो गया है, तो किसी को भी इस के लिए एक पैटर्न के जानता है, वह भी सराहना की जाएगी

संपादित करें:।

Slauma की सलाह ले रहे हैं और दूर करने db.Or के बाद ders.Add (आदेश)। मैं कॉल को डीबी में प्रवेश करने में सक्षम था। एंटर्री (ऑर्डर)। फोरैच लूप के नीचे सेट करें। इसने मुझे लूप के माध्यम से लूप करने की अनुमति दी और मौजूदा ऑर्डर के लिए संशोधित करने के लिए प्रत्येक ऑर्डरडिउंट ऑब्जेक्ट की स्थिति सेट की और जोड़ा गया एक जोड़ा। तब मुझे माता-पिता के ऑर्डर आईडी को बच्चे के ऑर्डर आईडी में असाइन करना पड़ा और अपडेट सफल रहा। मैंने उस कोड को भी शामिल किया है जिसका उपयोग मैंने संपादन के दौरान बाल वस्तुओं को हटाने के लिए किया है। मुझे यकीन नहीं है कि यह कितना कुशल है, लेकिन यह काम करता है।

db.Orders.Add(order); 

यह वास्तव में सभी ORDERDETAILS Added राज्य में सहित आदेश रखा जाएगा: यहाँ संशोधित कोड है:

[HttpPost] 
    public ActionResult Edit(Order order) 
    { 
     if (ModelState.IsValid) 
     { 
      List<int> previousProductIds = db.OrderDetails 
       .Where(ep => ep.OrderId == order.OrderId) 
       .Select(ep => ep.ProductId) 
       .ToList(); 

      List<int> currentProductIds = order.OrderDetails 
       .Select(o => o.ProductId) 
       .ToList(); 

      List<int> deletedProductIds = previousProductIds 
       .Except(currentProductIds).ToList(); 


      foreach (var deletedProductId in deletedProductIds) 
      { 
       OrderDetail deletedOrderDetail = db.OrderDetails 
        .Where(od => od.OrderId == order.OrderId && od.ProductId == deletedProductId) 
        .Single(); 

       db.Entry(deletedOrderDetail).State = EntityState.Deleted; 
      } 

      foreach (var orderDetail in order.OrderDetails) 
      { 
       if (orderDetail.OrderId == 0) 
       { 
        db.Entry(orderDetail).State = EntityState.Added; 
        orderDetail.OrderId = order.OrderId; 
       } 
       else 
       { 
        db.Entry(orderDetail).State = EntityState.Modified; 
       } 
      } 
      db.Entry(order).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     ViewBag.CustomerId = new SelectList(db.Customers, "CustomerId", "CompanyName", order.CustomerId); 
     return View(order); 
    } 
+0

प्रश्न के लिए धन्यवाद। वास्तव में आपके कोड ने मुझे किसी इकाई के बच्चों को अपडेट या डालने का एक आसान समाधान देने में मदद की। कट और पेस्ट, पहली बार काम किया, काम किया। +1 –

उत्तर

1

निकालें अपने कोड से इस लाइन। रिलेशनशिप फ़िक्सअप (जो स्वचालित रूप से Add में होता है) OrderDetails ऑर्डर की कुंजी पर OrderId सेट करेगा। जब आप सभी विवरण वस्तुओं के लिए लूप orderDetail.OrderId!= 0 दर्ज करते हैं और आप हमेशा शाखा दर्ज करते हैं जो राज्य को Modified पर सेट करता है। लूप समाप्त होने पर कोई आदेश नहीं आइटम Added स्थिति में है।

+0

हाय स्लुमा, प्रतिक्रिया के लिए धन्यवाद। यदि मैं लाइन db.Orders.Add (ऑर्डर) को हटा देता हूं, तो कॉल जो ऑर्डर इकाई की स्थिति को संशोधित करने के लिए संशोधित करता है, कोड को फोरैच लूप तक पहुंचने से पहले एक रेफरेंशियल अखंडता उल्लंघन का कारण बनता है। हालांकि, आपके उत्तर ने मुझे एक अलग दृष्टिकोण की कोशिश करने की अनुमति दी जो काम करता है, जिसे मैं अपने मूल प्रश्न में एक संपादन में रखने जा रहा हूं। – MickySmig

संबंधित मुद्दे