2012-05-23 9 views
9

रखें जब मैं निम्नलिखित कोड के साथ एक फ़ोरैच के माध्यम से पुन: प्रयास करता हूं तो यह पहले अपवाद को सफलतापूर्वक पकड़ता है और आईडी को मेरी त्रुटि सूची में जोड़ता है। लूप के बाद के पुनरावृत्तियों पर, यह पिछले अपवाद को पकड़ना जारी रखेगा।इकाई फ्रेमवर्क; फ़ोरैच लूप में अपवाद को कैसे संभालें और इसे

मैं अपवाद को उचित रूप से कैसे पकड़ सकता हूं और असफल DeleteObject अनुरोध को पूर्ववत या साफ़ कर सकता हूं ताकि बाद में हटाए जा सकें।

public ActionResult Delete(int[] ListData) 
{ 
    List<int> removed = new List<int>(); 
    List<int> error = new List<int>(); 
    Item deleteMe; 
    foreach (var id in ListData) 
    { 
     deleteMe = this.getValidObject(id); 
     if (deleteMe == null) 
     { 
      error.Add(id); 
      continue; 
     } 

     try 
     { 
      this.DB.Items.DeleteObject(deleteMe); 
      this.DB.SaveChanges(); 
      removed.Add(id); 
     } 
     catch (DataException ex) 
     { 
      // revert change to this.DB.Items? 
      error.Add(id); 
     } 
    } 
    if (error.Count > 0) 
    { 
     return Json(new { Success = false, Removed = removed, Error = error }); 
    } 
    return Json(new { Success = true, Removed = removed }); 
} 

मैं इतना खोज की है और गूगल और ज्यादातर लोगों के लिए पहले सभी हटाने वस्तुओं की प्रक्रिया और उसके बाद इतना है कि यह एक लेन-देन है परिवर्तन की बचत होगी है। लेकिन मुझे प्रत्येक लेनदेन को व्यक्तिगत रूप से संसाधित करने की आवश्यकता है ताकि एक विफलता शेष लेनदेन को रोक न सके।

मैं इकाई की रूपरेखा 4.

अपवाद मैं इस विशिष्ट विदेशी कुंजी की वजह से उदाहरण के लिए मिलता है आइटम है कि निकाले जाने के जुड़ा रहा उपयोग कर रहा हूँ। उत्पादन में रहते हुए मैं इस परिदृश्य को संभालेगा, इससे कोई फर्क नहीं पड़ता कि अपवाद क्या है।

+0

ListData क्या है? एक 'सूची <> 'या' IQueryable <> '? –

+0

मैंने अधिक संदर्भ दिखाने के लिए कोड को अद्यतन किया है। – SidewaysGravity

उत्तर

7

मुझे लगता है कि एक ही संदर्भ, this.DB, किसी इकाई को पुनर्प्राप्त करने के लिए this.getValidObject(id) में उपयोग किया जा रहा है। यदि ऐसा है, अपवाद ब्लॉक कॉल में: this.DB.detach(deleteme)। अगले पुनरावृत्ति पर समस्याग्रस्त इकाई को हटाने की कोशिश करने के लिए SaveChanges() को रोकना चाहिए।

+0

हां, यह एक ही संदर्भ का उपयोग कर रहा है। अलग काम किया और लागू करने के लिए आसान है। धन्यवाद – SidewaysGravity

+0

ईएफ 4 और नए के लिए, इस http://stackoverflow.com/q/4168073/37760 को डिटेच विधि तक पहुंचने के लिए पढ़ें। – Corin

0

आपके द्वारा पेश किया गया कोड अच्छा दिखता है। आपको क्या त्रुटि है? जैसा कि आपने नोट किया है, हो सकता है कि आपको इसमें कुछ अन-टैग करने की आवश्यकता हो। डीबी। ऐसा लगता है, हालांकि मुझे ऐसा नहीं लगता है। आप प्रत्येक लूप के लिए एक नया डेटा कॉन्टेक्स्ट बनाने का भी प्रयास कर सकते हैं जैसे कि दुनिया में पुराने, असफल डेटाकॉन्टेक्स्ट का राज्य अप्रासंगिक है।

+0

क्या परिवर्तन को अन-टैग करना संभव है ताकि अपवाद के बाद SaveChanges को अगली कॉल पिछले आइटम को फिर से हटाने और अपवाद को फिर से हटाने का प्रयास न करे। मैं एक नया डेटा संदर्भ बनाने का प्रयास करूंगा और देख सकता हूं कि यह काम करता है या नहीं। – SidewaysGravity

0

यदि मैं सही ढंग से समझ गया, तो आप इकाई (आइटम) को हटा नहीं सकते क्योंकि इसमें एक विदेशी कुंजी एसोसिएशन (बच्चा) है।
आपको पहले माता-पिता (आइटम) का उपयोग करके रिश्ते को हटाकर, एक वैकल्पिक माता-पिता (आइटम) से संबंधित या बच्चे इकाई (इकाइयों) को हटाने के लिए इकाई को अपडेट करके सभी बच्चे (संबंधित) इकाइयों को अपडेट करना होगा। और फिर अंत में अभिभावक (आइटम) इकाई को हटा दें।

+0

हां, मैं समझता हूं और उस परिदृश्य के लिए बस यही करूँगा। लेकिन अगर किसी भी प्रकार के अपवाद हैं, तो मैं पुनरावृत्ति जारी रखने में सक्षम होना चाहता हूं, और यह संभव हो सकता है कि मैं अपवाद को सही तरीके से संभाल नहीं पाऊंगा, इस मामले में मैं केवल उपयोगकर्ता को सूचित करूंगा कि इसे हटाया नहीं जा सका एक त्रुटि के लिए। – SidewaysGravity

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