2012-06-19 13 views
12

मैं इकाई फ्रेमवर्क 4.0 का उपयोग करता हूं। क्या यह संभव है कि SaveChanges() 0 लौटाता है लेकिन अपवाद नहीं फेंकता है? उदाहरण के लिए, जोड़ने के बाद।क्या यह संभव है, DbContext.SaveChanges() 0 देता है लेकिन इसमें कोई अपवाद नहीं है?

try 
{ 
    _context.CodeProducts.Add(entity); 
    _context.SaveChanges(); 

    //Shell I control return result from SaveChanges() in here. 
    //However doesn't throw an exceoption? 

    return new MethodResponse() 
    { 
     ResultText = "Successful", 
     Type = MethodResponse.ResponseType.Succeed 
    }; 
} 
catch (OptimisticConcurrencyException exc) 
{ 
    throw exc; 
} 
catch (UpdateException exc) 
{ 
    throw exc; 
} 
catch (Exception exc) 
{ 
    throw exc; 
} 
+1

कुछ भी बचत की जरूरत किया था? –

+2

आपको और जानकारी जोड़ने की ज़रूरत है अन्यथा कोई भी मदद करने में सक्षम नहीं होगा। क्या आप अपना कोड पोस्ट कर सकते हैं? –

+0

मैंने अपने कोड जोड़े। – cagin

उत्तर

19

the documentation के अनुसार, DbContext.SaveChanges की वापसी मूल्य अंतर्निहित डेटाबेस के लिए लिखा वस्तुओं की संख्या

है:

यहाँ मेरी कोड है।

तो आप जो देखते हैं वह केवल तभी संभव है जब डेटाबेस में किसी भी संस्था को सहेजने की आवश्यकता न हो।

+0

यह सही है - उदाहरण के लिए: यदि आप ऐसी पंक्ति को हटाते हैं जो अब मौजूद नहीं है तो आपको 0 प्रभावित पंक्तियां – Carsten

+1

@ कार्स्टनकॉन्ग नो, यदि आप ऐसी पंक्ति को हटाते हैं जो अब मौजूद नहीं है, तो डेटाबेस "0 पंक्तियों को प्रभावित करेगा" , और ईएफ इसे अपवाद में अनुवादित करेगा। "सहेजी जाने वाली कोई भी संस्था नहीं है" का अर्थ है 'सेव चेंज' कहने से पहले संदर्भ में कोई बदलाव नहीं आया था। – hvd

+0

वास्तव में? इसे आजमाएं, लेकिन मुझे लगता है कि मुझे अपवाद के बिना अतीत में समान समस्याएं थीं लेकिन सुधार के लिए धन्यवाद – Carsten

3

एंटीटी फ्रेमवर्क का डीबी। सेव चेंज() हटाए जाने और सहेजने के लिए संख्या पंक्तियों को प्रभावित करता है। फ़ेक्स फ्रेमवर्क (स्टब्स और शिम्स) का उपयोग करके परीक्षण में, हालांकि, लौटाया गया मान हमेशा 0 होगा। यदि कॉल में कोई त्रुटि है, तो एक अपवाद फेंक दिया जाएगा। निहितार्थ यह है कि शून्य से अधिक मान पर निर्भर किसी भी कॉलिंग विधि को डीबी से वापस लौटाया गया है। पुष्टि के लिए सहेजने वाले को उसी मूल्य के लिए परीक्षण नहीं किया जा सकता है। जब कोई विधि किसी दिए गए ऑपरेशन में प्रभावित पंक्तियों की संख्या का मूल्यांकन करने के लिए db.SaveChanges() वापसी मान का उपयोग कर रही है तो यह महत्वपूर्ण साबित हो सकता है।

0

मेरा जवाब के बारे में DbContext उल्लेख नहीं है, लेकिन अगर किसी को XEntities का उपयोग करने और एक ही समस्या हो रही है, आप की कोशिश कर सकते हैं:

using (var entities = new XEntities()) 
{ 
    var product = entities.Products.SingleOrDefault(x => x.Id == id); 
    product.Type = "New type"; // modifying 

    int flag = entities.SaveChanges(); // 1 
    // or await entities.SaveChangesAsync(); // 1 
} 

समस्या:

public class Demo 
{ 
    private XEntities _entities = new XEntities(); 

    public void Test(int id) 
    { 
     var product = _entities.Product.SingleOrDefault(x => x.Id == id); 
     product.Type = "New type"; // modifying 

     int flag = _entities.SaveChanges(); // 0 <<<==== 
     // or await entities.SaveChangesAsync(); // 0 <<<==== 

     // you need to create new instance of XEntities to apply changes 
    } 
} 
संबंधित मुद्दे