2012-04-20 10 views
5

में डब्लूसीएफ डेजरीलाइजिंग खाली आईसीलेक्शन को रोकें मुझे डब्ल्यूसीएफ और एंटिटी फ्रेमवर्क 4.1 पीओसीओ ऑब्जेक्ट्स (टी 4 टेम्पलेट्स का उपयोग करके उत्पन्न) का उपयोग करने में समस्या है। मेरी मूल समस्या यह है कि जब मेरे क्लाइंट से सेवा में एक पीओसीओ ऑब्जेक्ट भेजते हैं, तो डब्ल्यूसीएफ एक निश्चित आकार सरणी के रूप में टाइप आईसीओलेक्शन के सदस्य चर को deserializing है।शून्य क्षमता एरे

क्लाइंट साइड पर मैं दृश्य स्टूडियो को टी [] के बजाय IList का उपयोग करने के लिए कह सकता हूं - लेकिन मैं सर्वर अंत में इस तरह के किसी भी विकल्प को नहीं देख सकता।

इससे कई चीजों के साथ समस्याओं का कोई अंत नहीं होता है, जैसे कि इन ऑब्जेक्ट्स को डेटाबेस पर वापस रखना।

क्या डब्ल्यूसीएफ को यह बताने का कोई तरीका है कि किस ऑब्जेक्ट प्रकार को आईसीओलेक्शन (या किसी भी सरणी) को deserialize करने के लिए?

+0

अपने सदस्य चर प्रकार '' ICollection' problems' का कोई अंत नहीं का कारण बनता है तो क्यों आप यह कुछ है कि संभाला नहीं जा सकता के रूप में परिभाषित किया है की है? यानी इसे 'IList' के रूप में परिभाषित क्यों न करें यदि आपकी इच्छा पूरी हो। शायद डाउनस्ट्रीम – wal

+0

का कारण बनने वाले मुद्दों पर विस्तृत करें क्योंकि पीओसीओ टी 4 टेम्पलेट्स आईसीओलेक्शन निर्दिष्ट करते हैं - मैं हाथ से पीओसीओ नहीं लिख रहा हूं। एक अंतरिम उपाय के रूप में मैंने टी 4 टेम्पलेट्स को हैशसेट बनाने के लिए संशोधित किया है, जो ठीक काम करता है, लेकिन ऐसा लगता है कि निर्दिष्ट निर्दिष्ट जेनेरिक/इंटरफ़ेस प्रकार को deserializing करते समय उन्हें किस ठोस प्रकार का उपयोग करना है, यह निर्दिष्ट करने के लिए एक तरीका होना चाहिए। –

उत्तर

5

मुझे आश्चर्य है कि अधिकतर लोग इस मुद्दे में नहीं चले गए हैं, क्योंकि जब आप डब्ल्यूसीएफ पर ईएफ टी 4 जेनरेटेड पॉको ऑब्जेक्ट्स का उपयोग करने का प्रयास करते हैं तो यह आपको चेहरे पर धक्का देता है। विशेष रूप से, मुझे जो त्रुटि मिल रही थी वह कुछ कहती है:

अपवाद: "इकाई प्रकार Datalayer.Customers पर फ़ील्ड/संपत्ति ऑर्डर सेट करने में असमर्थ। विवरण के लिए आंतरिक अपवाद देखें।"

इनर एक्सेप्शन: "एक आइटम को एक निश्चित आकार ऐरे के प्रकार में जोड़ा नहीं जा सकता है 'Datalayer.Order []'।"

किसी भी हाल में एकमात्र समाधान मैं के साथ आने कर लिया है एक है कि आप का उल्लेख है, अर्थात्, संशोधित टी -4 टेम्पलेट्स HashSet बजाय ICollection उपयोग करने के लिए है। मुझे सबसे स्वच्छ के रूप में नहीं मारा जाता है, लेकिन ऐसा लगता है कि यह काम करता है।

+0

इंटरस्टेसिंग, मुझे विपरीत दिशा में एक ही समस्या है (क्लाइंट से सर्वर)। यह तरीका अधिक समस्याग्रस्त है क्योंकि क्लाइंट एक निश्चित आकार सरणी में पंक्तियों को जोड़ या हटा नहीं सकता है। मैंने हैशसेट के साथ आईसीओलेक्शन को प्रतिस्थापित करने के लिए टी 4 टेम्पलेट को संशोधित करने का प्रयास किया है। यह समस्या का समाधान नहीं करता है। –

+0

ऐसा लगता है कि यह "सेवा जोड़ें संदर्भ" संवाद बॉक्स (या svcutil.exe) में निर्दिष्ट पैरामीटर के साथ एक समस्या हो सकती है। क्या आपने ऑब्जेर्जेबल कोलेक्शन के रूप में उपयोग किए जाने वाले संग्रहण प्रकार को निर्दिष्ट करने का प्रयास किया है? –

+0

इसे "सेवा संदर्भ जोड़ें" संवाद में चयनित संग्रह प्रकार के रूप में System.Crlection.Generic.List का उपयोग करके हल किया गया। –

1

मैं इकाई फ्रेमवर्क 6 का उपयोग कर रहा हूं, और मैं अपने टी 4 टेम्पलेट में निम्नलिखित परिवर्तन करके इस समस्या को हल करने में सक्षम था।

मैं निम्नलिखित लाइन जहां यह नेविगेशन गुण पैदा करता है से

navProp.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType, 

को
navProp.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("List<" + endType + ">") : endType, 

तब मैं कोड है कि में नेविगेशन संपत्ति सेट बदल एक संग्रह के बजाय एक सूची का उपयोग करने के लिए बदल डिफॉल्ट हैशसेट को कॉल करने के लिए एक सूची में कनवर्ट करने के लिए कन्स्ट्रक्टर। टोलिस्ट()। इस लाइन

this.<#=code.Escape(navigationProperty)#> = new HashSet<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>(); 

this.<#=code.Escape(navigationProperty)#> = new HashSet<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>().ToList(); 

में बदल गया था HashSet <> .ToList() विधि, एक विस्तार है ताकि विस्तार विधि उपलब्ध बनाने के लिए में ऐसा है, तो मैं एक का उपयोग कर System.Linq बयान जोड़ा UsingDirectives विधि को संशोधित करके:

public string UsingDirectives(bool inHeader, bool includeCollections = true) 
{ 
    return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion()) 
     ? string.Format(
      CultureInfo.InvariantCulture, 
      "{0}using System;{1}" + Environment.NewLine + 
      "{0}using System.Linq;" + 
      "{2}", 
      inHeader ? Environment.NewLine : "", 
      includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "", 
      inHeader ? "" : Environment.NewLine, 
      Environment.NewLine) 
     : ""; 
}