2011-02-09 9 views
5

मैंने अभी अपनी परियोजना में कोड अनुबंध का उपयोग करना शुरू कर दिया है। हालांकि, मुझे अपने भंडार कार्यान्वयन में कोई समस्या है, जो एंटीटी फ्रेमवर्क का उपयोग करके मेरे डेटाबेस से पूछताछ करता है।.NET 4 कोड अनुबंध: "अनुमोदित की आवश्यकता है: स्रोत! = शून्य"

public IEnumerable<Organization> GetAllOrganizations() 
{ 
    return _uow.CreateSet<Party>().OfType<Organization>().AsEnumerable(); 
} 

विधि एक संग्रह डेटाबेस में सभी संगठनों से युक्त, या एक खाली संग्रह वहाँ डेटाबेस में संगठनों नहीं है रिटर्न:

मैं निम्न विधि है।

बहरहाल, यह ठीक नहीं है CodeContracts, जो मुझे त्रुटि दिखा सकते हैं के अनुसार है: "की आवश्यकता है अप्रमाणित: स्रोत = अशक्त"

क्या यह मुझे बताने की कोशिश कर रहा है? मैं अनुबंध.एसम्यूम का उपयोग कर कोड अनुबंधों को पूरा कर सकता हूं, यह मानने के लिए कि यह हमेशा कुछ खोजेगा, लेकिन फिर मुझे डेटाबेस से डेटा पढ़ने वाले सभी तरीकों से ऐसा करने की ज़रूरत है।

क्या मुझे यहां कुछ याद आ रहा है, या जब आप डेटाबेस और LINQ के साथ काम कर रहे हैं तो यह इरादा व्यवहार है?

+0

"स्रोत" क्या है? क्या आप जिस तरीके से कॉल कर रहे हैं, उसके पास अनुबंध हैं? –

+2

क्या [यह] (http://stackoverflow.com/questions/3050279/how-to-avoid-source-null-when-using-code-contracts-and-linq-to-sql) किसी भी मदद पर सवाल है? – adrianbanks

+0

@Anon: मुझे नहीं पता कि "स्रोत" क्या है। मुझे पता नहीं है कि एंटीटी फ्रेमवर्क में विधियों पर अनुबंध हैं, लेकिन मुझे ऐसा नहीं लगता है। @adrianbanks: क्षमा करें, मैं नहीं देख सकता कि यह मेरी मदद कैसे कर सकता है। – Vern

उत्तर

2

मेरा अनुमान है कि CreateSet, OfType और AsEnumerable विधियों में से एक को "स्रोत" नामक इस पैरामीटर के साथ एक विस्तार विधि के रूप में घोषित किया गया है, और CodeContrcts यह साबित नहीं कर सकता कि यह शून्य नहीं है। साथ ही, क्या आपको यह निर्दिष्ट करने के लिए क्लॉज की आवश्यकता नहीं है कि _ प्रविष्टि पर शून्य न हो?

CreateSet विस्तार विधि प्रतीत होता है क्योंकि यह एमएसडीएन में प्रकट नहीं होता है। विधि लौट अशक्त कभी नहीं करना चाहिए, तो आप CreateSet को यह अनुबंध जोड़कर इस लागू कर सकते हैं:

Contract.Ensures(Contract.Result<T>() != null); 

CodeContracts विश्लेषक इस नियम को देखता है, तो यह सबूत के रूप में ले जाएगा कि OfType के लिए इनपुट अशक्त नहीं होगा, और चेतावनी दूर जाना चाहिए।

+0

यह सबसे अधिक संभावना 'AsEnumerable' है, जिसमें 'स्रोत! = Null' पूर्व शर्त है। मुझे यकीन नहीं है कि एंटीटी फ्रेमवर्क में विधियों पर कई (कोई?) अनुबंध हैं, इसलिए न तो 'CreateSet' और न ही' टाइप टाइप 'पर पोस्टकंडीशन हैं। आपको अपना खुद का रैपर फ़ंक्शन बनाना पड़ सकता है। – porges

+0

यदि आप उस पूर्व शर्त को पूरा करने के लिए कोड के कॉलर जिम्मेदार हैं तो आप केवल पूर्व शर्त निर्धारित कर सकते हैं। इस मामले में, ऐसा लगता है कि अब एक आंतरिक ज़िम्मेदारी है, कॉलर की नहीं। – koenmetsu

+0

आप सही हैं कि मुझे निर्दिष्ट करने के लिए क्लॉज की आवश्यकता है कि _uow गैर-शून्य है। लेकिन जोड़ने के बाद भी मुझे त्रुटि मिल रही है। @Porges: मुझे लगता है कि आप इस कारण के कारण होने के बारे में सही हैं। मैंने AsNumerable के साथ कुछ परीक्षण किया है और मुझे यहां समस्या भी मिली है। यह बहुत सारे कार्यों के लिए रैपर कार्यों को लिखने के लिए एक बहुत ही कठिन काम की तरह लगता है - जब तृतीय पक्ष एपीआई का उपयोग करते हैं जो कोड अनुबंधों का उपयोग नहीं करते हैं। मुझे कोड अनुबंधों का उपयोग करके पुनर्विचार करना होगा। – Vern

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