18

प्रत्येक विधि के लिए फायदे/नुकसान क्या हैं?इकाई फ्रेमवर्क 4, विरासत बनाम बनाम?

मैं जानता हूँ कि मैं क्यों तालिका वंशानुक्रम का उपयोग या तो एक किताब में या इस साइट पर कहीं पढ़ा है के लिए इकाई की रूपरेखा 4.

उदाहरण के लिए, क्यों एक मेज जो एक entityId है, DateCreated, datemodified नहीं कर भद्दा है और उसके बाद हर दूसरे वर्ग को इकाई ढांचे में विरासत मिलती है? फिर अन्य सभी इकाइयों के लिए मेरी टेबलों को उन स्तंभों की आवश्यकता नहीं है। तब मैं एक व्यक्ति वर्ग को उस बेस क्लास का उत्तराधिकारी बना सकता हूं, और उसके बाद एक विशिष्ट व्यक्ति व्यक्ति का उत्तराधिकारी हो सकता है।

मैं दूसरे हालांकि डेटाबेस उत्पन्न करने के लिए एक छोटे SQL स्क्रिप्ट लिखने की तुलना में इस के फायदे के बारे में सुनिश्चित नहीं कर रहा हूँ ...

नुकसान मैं देख रहा हूँ कि यह क्वेरी करने बनाता है/सीधे एक बड़ा दर्द डेटा देखते हुए एसक्यूएल में हैं गधे में (सभी प्रासंगिक जानकारी इतनी सारी तालिकाओं में टूट गई है), और मैंने अपने दोस्त से यह भी पूछा कि

"मेरे लिए चिपकने वाली सबसे बड़ी चीज यह तथ्य है कि मैं अपना डेटाबेस नहीं चाहता मेरे आवेदन की वर्तमान विरासत संरचना पर भरोसा करें। यदि, किसी भी कारण से, मैं विरासत के मामले में अपने आवेदन के डिजाइन को बदलना चाहता था, इससे कोई फर्क नहीं पड़ता क्योंकि मेरा डेटा नहीं होगा मेरे वर्तमान सिस्टम डिजाइन पर निर्भर रहो। मैं डाटा स्टोरेज के बारे में सोचता हूं - स्टोरेज। डेटाबेस को उचित डेटाबेस डिज़ाइन के अनुसार सामान्यीकृत किया जाता है, लेकिन विरासत अनुप्रयोग विकास की एक प्रोग्रामिक पसंद है, डेटा संग्रहण नहीं। वह अकेले मुझे इसका इस्तेमाल करने से रोक देगा। जब एप्लिकेशन को डिज़ाइन करने की बात आती है तो विरासत ठीक से करने के लिए एक बहुत ही मुश्किल बात है। डाटा कोड को बदलने और माइग्रेट करने के बजाय एप्लिकेशन कोड को बदलना बहुत आसान है जब सबसे कम अनुभवी देवता किसी समस्या से संपर्क करते हैं तो वे विरासत के साथ पहुंचते हैं। मैंने भी ऐसा किया जब मैंने पहली बार विकास करना शुरू किया। यह तार्किक रूप से समझ में आता है। हालांकि एक बार लंबे समय तक विकास करने के बाद आप सीखते हैं कि प्रतिनिधिमंडल वास्तव में जाने का सबसे अच्छा तरीका है (सोया के मामले में सेवाओं को कॉल करने वाली सेवाएं) और वह एकल उद्देश्य सेवाएं विरासत से बहुत अधिक पुन: उपयोग प्रदान करती हैं। "

यह भी मेरे लिए समझ में आता है।

तो

1) सामान्य में, क्या कर रहे हैं पेशेवरों/विरासत की विपक्ष
2) का विस्तार ऊपर मेरी विशिष्ट उदाहरण में बनाम, क्या अधिक उचित होगा?
3) अगर मेरा उदाहरण किसी या दोनों के लिए क्रोधित है, तो एक अच्छा उदाहरण क्या है विरासत का उपयोग करने और विस्तार का उपयोग करने के लिए?

मैंने पहले दोनों का उपयोग किया है, लेकिन जैसा कि मैं अनुभवी से दूर हूं, मैं अभी भी अनिश्चित हूं कि सभी परिस्थितियों को कैसे संभालना है।

10 वोट, 8 पसंदीदा, सौ से अधिक विचार और कोई भी विस्तार नहीं कर सकता? = (।

उत्तर

5

मैं इसी तरह की बात की कोशिश की है के रूप में आप का वर्णन है, और मुख्य समस्या मैं देख रहा हूँ, कि यू ObjectSet<T> व्युत्पन्न प्रकार के लिए नहीं बना सकते हैं। तो तुम ObjectSet<Person> भंडार। नहीं होगा आप अपने सभी संस्थाओं निकाले जाते हैं उदाहरण के लिए BusinessObject इकाई, आप केवल ObjectSet<BusinessObject> के साथ काम करने में सक्षम होंगे। अगर आप केवल व्यक्ति भंडार से पूछना चाहते हैं, तो आप Context.BusinessObjectSet.OfType<Person>().ToList() जैसे क्वेरी लिख सकते हैं, लेकिन मुझे लगता है कि यह हुड के तहत उचित SQL उत्पन्न नहीं करेगा और पहले पूर्ण BusinessObject पंक्तियां प्राप्त करेंगी और फिर स्मृति इकाइयों को स्मृति में फ़िल्टर करें। तो मुझे लगता है कि इसका प्रदर्शन बहुत बड़ा होगा।

+0

उत्तर बीपी के लिए धन्यवाद, क्या आप इस अवसर पर विस्तार कर सकते हैं? या कोई अन्य पेशेवर और विपक्ष नहीं हैं? विरासत का उपयोग करने के लिए तो एक अच्छा उदाहरण क्या होगा? – SventoryMang

+0

दरअसल, ओएफटी टाइप एसक्यूएल पक्ष, आईआईआरसी पर फ़िल्टर किया गया है –

3

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

9

मैं पार्टी के लिए थोड़ा देर हो चुकी हूं, लेकिन मेरे पास ईएफ में विरासत के संबंध में वही प्रश्न हैं और आपको पढ़ने के लिए एक बहुत अच्छा सारांश मिला है। यह excerpt from Julie Lerman's book Programming Entity Framework है।

यह पढ़ने के बाद, यहाँ विषय पर मेरी निष्कर्ष है:

1) सामान्य में, उत्तराधिकार के पेशेवरों/विपक्ष विस्तार बनाम हैं क्या - पेशेवरों वास्तव में मेज रणनीति आप चुनते हैं पर निर्भर करते हैं। How to choose an Inheritance Strategy - MSDN Blog देखें। हालांकि, वे इस धारणा पर केवल "पेशेवर" हैं कि आपने पहले ही विरासत का उपयोग करने का निर्णय लिया है। और यह हल्के से लेने का निर्णय नहीं है।

विपक्ष कई हैं, लेकिन सबसे बड़ी स्थिति डेटाबेस में मौजूदा इकाई को व्युत्पन्न इकाई के रूप में जोड़ने में असमर्थता है। उदाहरण के लिए: मेरे पास एक छात्र है जो व्यक्ति से विरासत में मिलता है। जॉन स्मिथ के लिए एक व्यक्ति रिकॉर्ड है। कुछ समय बाद मुझे जॉन स्मिथ को छात्र बनने की ज़रूरत है। खैर बहुत बुरा हुआ। यह संभव नहीं है। (कम से कम एक संग्रहित प्रक्रिया के साथ ईएफ को बाधित किए बिना)।

2) उपरोक्त मेरे विशिष्ट उदाहरण में, और अधिक उपयुक्त क्या होगा? - आपके उदाहरण में आपको केवल उन कॉलम (entityId, datecreated, datemodified) को उन तालिकाओं में जोड़ना चाहिए जिन्हें उनकी आवश्यकता है। आप डेटेक्टेड और डेटमोडाइफाइड के लिए कॉम्प्लेक्स टाइप का उपयोग कर सकते हैं, लेकिन यह तब तक जरूरी नहीं होगा जब तक कि आप बहुत सख्त ड्रवाई लड़के न हों। फिर भी, यह अधिक हो सकता है। कारण यह है कि एक बार आपके पास एक इकाई हो, तो आप उस इकाई को किसी अन्य व्युत्पन्न तालिका में कभी भी नहीं जोड़ सकते हैं। एक व्यक्ति (जो आधारभूतता है) बाद में छात्र के रूप में नहीं जोड़ा जा सकता है। इसके अलावा, LINQ प्रश्नों को लिखना आवश्यक से कहीं अधिक जटिल होगा। एलेक्स ने पहले ही दिखाया है।

3) यदि मेरा उदाहरण किसी या दोनों के लिए क्रोधित है, तो विरासत का उपयोग करने और विस्तार का उपयोग करने के लिए एक अच्छा उदाहरण क्या है? - आम तौर पर, यदि आप अपना बेस-टाइप सार बना सकते हैं, तो विरासत आपके लिए काम कर सकता है। लेकिन आपको अभी भी पहले अन्य विकल्पों पर विचार करना चाहिए। यदि आपका बेस टाइप सीधे तुरंत चालू हो जाएगा, तो बस रचना का उपयोग करें। जब वास्तव में पूछताछ और रिकॉर्ड डालने की बात आती है तो विरासत बहुत परेशानी हो जाती है।

सारांश में, सिर्फ इसलिए कि आप ईएफ में विरासत कर सकते हैं इसका मतलब यह नहीं है कि आपको चाहिए। यदि आप एक विरासत मुक्त डिजाइन से दूर हो सकते हैं, तो हर तरह से इसे करें।

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