2013-08-20 4 views
7

मैंने हाल ही में एंटीटी फ्रेमवर्क 5 पर स्विच किया है। अब, मैं मौजूदा डेटाबेस से पीओसीओ कक्षाएं उत्पन्न करना चाहता हूं और मुझे आलसी लोडिंग और परिवर्तन दोनों को बदलने की भी आवश्यकता है। तो सभी स्केलर गुण वर्चुअल के साथ ही नेविगेशन गुण होना चाहिए।किसी मौजूदा डेटाबेस से POCO प्रॉक्सी उत्पन्न करने के लिए कैसे करें

एक नया एडीओ.Net इकाई डेटा मॉडल जोड़ना एक .edmx फ़ाइल और कुछ अन्य .cs और .tt फ़ाइलों में समाप्त होता है।

सबसे पहले, मुझे आश्चर्य है कि डिफ़ॉल्ट रूप से जेनरेट किए गए पीओसीओ कक्षाएं क्यों परिवर्तन ट्रैकिंग प्रॉक्सी की आवश्यकताओं को पूरा नहीं करती हैं, यानी स्केलर गुण वर्चुअल नहीं हैं।

दूसरा, मैं प्रॉक्सी-सक्षम पॉको कक्षाओं को कैसे जनरेट कर सकता हूं?

पीएस: मैंने स्लैमा के उत्तर को अब तक का सबसे अच्छा और एकमात्र उत्तर स्वीकार कर लिया है, लेकिन मैं इसके पहले भाग से सहमत नहीं हूं। प्रतिबंध और प्रदर्शन:

  • प्रॉक्सी-सक्षम संस्थाओं पर प्रतिबंध के बारे में: यहाँ मेरी तर्क

    Slauma प्रॉक्सी के साथ के बारे में दो समस्याओं में बात करती है कक्षाएं डीबी पहले विधि में इकाई द्वारा उत्पन्न कर रहे हैं जब फ्रेमवर्क, परिवर्तन-ट्रैकिंग प्रॉक्सी सक्षम करने के लिए कक्षाओं का पालन करने वाले नियमों को इतना महत्वपूर्ण नहीं है क्योंकि वे बिल्कुल प्रतिबंधित नहीं हैं। कौन वास्तव में परवाह करता है कि नेविगेशन संग्रह IList या हैशसेट हैं या नहीं? प्रतिबंधों के बारे में बात करना केवल तभी समझदार होता है जब एप्लिकेशन में पेरिओड डिज़ाइन किए गए क्लास होते हैं और टेबल से उत्पन्न होते हैं।

  • जटिल गुण डीबी में पहले समर्थित नहीं हैं। इसलिए हम उन्हें हमारी चर्चा से बाहर कर सकते हैं।

  • perfomrance के बारे में: the addressed article में और भी कुछ अन्य प्रयोगों मैं अध्ययन किया है अब तक के परिणाम बहुत स्नैपशॉट के पक्ष में प्रॉक्सी को अस्वीकार करने के कायल नहीं हैं। सबसे पहले, प्रयोगों की एक बड़ी संख्या ए.के.ए 10,000 पर किया गया था। यह असंभव नहीं है कि आपके आवेदन में बैच प्रक्रिया (डेटाबेस में नहीं) बड़ी संख्या में इकाइयों पर काम करती है, हालांकि बेहतर दृष्टिकोण माना जाता है जैसे संग्रहित प्रक्रिया। दूसरा, आवेदन और आवश्यकताओं के प्रकार के आधार पर, हम आम तौर पर उदाहरण के लिए कुछ संख्याओं से निपटते हैं उदाहरण के लिए जब रेपोजिटरी पैटर्न का उपयोग और उपयोग किया जाता है; प्रॉक्सी और स्नैपशॉट के प्रदर्शन के बीच कोई अंतर नहीं है। दिलचस्प बात यह है कि संबोधित प्रयोग में, गुणों के लिए समान मूल्य को फिर से असाइन करना एकमात्र मामला था जब प्रॉक्सी का प्रदर्शन नाटकीय रूप से विफल हो जाता है। लेकिन वास्तव में यह कौन करता है? परिवर्तन ट्रैकर को बार-बार सूचित करने से बचने के लिए सावधान रहना बहुत आसान है। दोबारा, इस मामले में महत्वपूर्ण समस्या तब होती है जब बड़ी संख्या में प्रवेश करने वालों का सामना किया जाता है।

उत्तर

4

सबसे पहले, मुझे आश्चर्य है कि क्यों उत्पन्न POCO कक्षाएं डिफ़ॉल्ट रूप से परिवर्तन पर नज़र रखने के लिए प्रॉक्सी की आवश्यकताओं, यानी अदिश गुण आभासी नहीं हैं को पूरा नहीं है।

परिवर्तन ट्रैकिंग प्रॉक्सी का उपयोग डिफ़ॉल्ट परिवर्तन ट्रैकिंग रणनीति के रूप में अनुशंसित नहीं है। यह this blog post में अधिक जानकारी में समझाया गया है। संक्षेप में परिवर्तन ट्रैकिंग प्रॉक्सी का उपयोग करने का मुख्य कारण - स्नैपशॉट आधारित परिवर्तन ट्रैकिंग की तुलना में बेहतर प्रदर्शन - हमेशा गारंटी नहीं दी जाती है - और कभी-कभी यह भी बदतर होती है - और नुकसान की सूची स्नैपशॉट आधारित परिवर्तन ट्रैकिंग के मुकाबले अधिक है।

अतीत में टी -4 टेम्पलेट्स कि POCO संस्थाओं उत्पन्न वास्तव में चिह्नित सभी गुण - अदिश गुण सहित - virtual के रूप में और प्रॉक्सी आधारित परिवर्तन ट्रैकिंग के लिए संस्थाओं को तैयार किया। ब्लॉग में वर्णित कारणों के लिए इसे ऊपर दिए गए ब्लॉग पोस्ट के नीचे this comment में उल्लिखित ईएफ 5 के लिए डीबीकॉन्टेक्स्ट जेनरेटर सहित नए टेम्पलेट्स के लिए बदल दिया गया है। अब, केवल नेविगेशन गुणों को virtual के रूप में चिह्नित किया गया है, लेकिन स्केलर गुण नहीं, जो आलसी लोडिंग की अनुमति देता है लेकिन परिवर्तन ट्रैकिंग प्रॉक्सी के लिए पर्याप्त नहीं है।

दूसरा, मैं प्रॉक्सी-सक्षम पॉको कक्षाएं कैसे उत्पन्न कर सकता हूं?

मुझे लगता है कि यह करना होगा किसी भी उपलब्ध टी -4 टेम्पलेट के बारे में पता नहीं कर रहा हूँ, लेकिन यह virtual के रूप में भी अदिश गुण चिह्नित करने के लिए डिफ़ॉल्ट टेम्पलेट को संशोधित करने के लिए काफी आसान है:

  • अपनी परियोजना में आप .tt एक्सटेंशन के साथ दो फाइलें होनी चाहिए: YourModelContainer.tt और YourModelContainer.Context.ttYourModelContainer.tt फ़ाइल खोलें।

  • इस फाइल में आप एक विधि Property बुलाया मिल जाएगा:

    public string Property(EdmProperty edmProperty) 
    { 
        return string.Format(
         CultureInfo.InvariantCulture, 
         "{0} {1} {2} {{ {3}get; {4}set; }}", 
         Accessibility.ForProperty(edmProperty), 
         _typeMapper.GetTypeName(edmProperty.TypeUsage), 
         _code.Escape(edmProperty), 
         _code.SpaceAfter(Accessibility.ForGetter(edmProperty)), 
         _code.SpaceAfter(Accessibility.ForSetter(edmProperty))); 
    } 
    

    बदलें लाइन के साथ ...

     Accessibility.ForProperty(edmProperty), 
    

    ... करने के लिए ...

     AccessibilityAndVirtual(Accessibility.ForProperty(edmProperty)), 
    

यही है।

अगर आप इससे परिचित नहीं हैं, तो बस इसका उल्लेख करने के लिए, लेकिन डेटाबेस का पहला प्रकार उपलब्ध है- यह Reverse Engineering an existing database to a Code-First model है। यह दृष्टिकोण एक टी 4 टेम्पलेट का उपयोग नहीं करता है लेकिन एक कोड-फर्स्ट मॉडल और फ्लुएंट एपीआई मैपिंग के साथ एक संदर्भ बनाता है। यह उपयोगी है यदि आप मॉडल वर्गों को कस्टमाइज़ करना और विस्तार करना चाहते हैं (आप मैन्युअल रूप से virtual संशोधक भी जोड़ सकते हैं) और भविष्य में कोड-फर्स्ट वर्कफ़्लो (और कोड-फर्स्ट माइग्रेशन) के साथ आगे बढ़ें ताकि आपके डेटाबेस स्कीमा को अपडेट और विकसित किया जा सके।

+0

आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। मैं आपके उत्तर के पहले भाग से सहमत नहीं हूं और मैंने तर्कों को दर्शाने के लिए अपना प्रश्न अपडेट किया है। हालांकि, दूसरा हिस्सा बहुत उपयोगी था। मैं कोड-फर्स्ट मॉडल से अवगत हूं लेकिन यह मेरी चिंता का नहीं है। – Alireza

+0

@ एलीरेज़ा: आंशिक रूप से मैं पहले भाग के आपके आलोचक से सहमत हूं। मैं अपने आप को ट्रैकिंग ट्रैकिंग प्रॉक्सी का एक प्रशंसक रहा हूं (http://stackoverflow.com/a/7112470/270591) और वे मेरी परियोजनाओं में से एक में एक जीवन बचतकर्ता थे। आर्थर विकर के लेख प्रकाशित होने के बाद मैं उनका उपयोग करने में थोड़ा और सावधान हो गया हूं। पहले भाग में कम या ज्यादा सिर्फ एफई टीम के दृष्टिकोण का एक उद्धरण कारण है कि वे शायद अदिश गुण जब नए T4 टेम्पलेट्स Pocos बनाने से 'virtual' संशोधक को हटा दिया है समझाने के लिए किया गया था। – Slauma

+1

शायद वे आपके जैसा कह रहे थे, लेकिन फिर भी वे प्रॉक्सी को पुन: सक्षम करने के तरीके सिखा सकते थे। यह माइक्रोसॉफ्ट द्वारा इतनी चुपचाप किया गया था कि कोई सोच सकता है कि प्रॉक्सी में एक बग है। – Alireza

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

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