NHibernate उपयोगकर्ता प्रोग्रामर सबसे आम गलतियों और विरोधी पैटर्न क्या हैं?


28

NHibernate उपयोगकर्ता प्रोग्रामर सबसे आम गलतियों और विरोधी पैटर्न क्या हैं? कृपया बताएं कि वे बुरे व्यवहार क्यों हैं या आगे पढ़ने के लिए संसाधन का लिंक दें।

उदाहरण के लिए:

  • नए NHibernate प्रोग्रामर के लिए एक विरोधी पैटर्न आम ORM शैली प्याज के बजाय पहचान / देशी POID का उपयोग करना है। यहां पढ़ें ...

1
आप यहाँ कुछ सामान्य गलतियाँ पा सकते हैं: NHProf अलर्ट

1
इसके अलावा NHibernate नुकसान के

जवाबों:


34

मेरे व्यक्तिगत "अक्सर समझाया गया" मुद्दे:

विरोधी पैटर्न

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

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

लेन-देन और कार्य पैटर्न की इकाई को नहीं समझना । बार-बार विरोधी पैटर्न: अंतर्निहित लेनदेन, सत्र-प्रति-संचालन और सत्र-प्रति-अनुप्रयोग। कुछ और पढ़ना:

राष्ट्रीय राजमार्ग का उपयोग घटनाओं में आवेदन तर्क डाल करने के लिए (जैसे। डालने और अद्यतन ट्रिगर में परिवर्तन ट्रैकिंग)

प्रति तालिका एक कक्षा बनाएं । कुछ लोग OOD को नहीं समझते हैं, अन्य लोग संबंधपरक डिज़ाइन को नहीं समझते हैं।

गलतियां

के उपयोग के एक-से-एक के बजाय कई-टू-वन की। मैंने इस उत्तर में समझाने की कोशिश की ।

SetMaxResult के साथ संयोजन में शामिल होने का उपयोग करना । उस विषय से संबंधित मेरे नवीनतम उत्तर:

लेखन स्वयं बदलती संस्थाओं । जब कोई इकाई एनएच द्वारा निर्धारित मूल्य को बिल्कुल वापस नहीं करती है, तो इसे गंदा माना जाता है और हर सत्र में अद्यतन किया जाता है। उदाहरण के लिए: एक संपत्ति सेटर में NH लगातार संग्रह की जगह।

  IList<Address> Addresses
  {
    get { return addresses; }
    // will cause the addresses collection to be built up from scratch
    // in the database in every session, even when just reading the entity.
    set { addresses = new List<Address>(value); }
  }

  int Whatever
  {
    // will make the entity dirty after reading negative values from the db.
    // this causes unexpected updates after just reading the entity.
    get { if (whatever < 0) return 0; }
    set { whatever = value; }
  }

अधिक हो सकता है।


2
+1: आपको "लिस्ट ऑफ यूनिट ऑफ़ वर्क पैटर्न" और "वन सेशन प्रति एप्लीकेशन" को अपनी सूची में जोड़ना चाहिए।
फाल्कन

@ फाल्कन: हाँ शायद। यह एक सामान्य "लेन-देन को नहीं समझना" समस्या है। कार्य की इकाई दृढ़ता अज्ञान से ढकी हुई है। हालांकि वे पूरी तरह से अलग अवधारणाएं हैं, लेकिन वे एक ही पैटर्न में परिणाम देते हैं।
स्टीफन स्टाइनगर

5

" एन + 1 समस्या का चयन करें "।

यह वह जगह है जहाँ आप प्रत्येक निकाय (एन) में हेरफेर करना चाहते हैं, और सभी संस्थाओं और उनकी विशेषताओं के एक एकल चयन के बजाय संस्थाओं (+1) की सूची प्राप्त करने के लिए चयन करना चाहते हैं।


1
  • बहुत सारे अमूर्त
  • के साथ Automappings का उपयोग नहीं FluentNHibernate

पहला बिंदु थोड़ा अस्पष्ट है, लेकिन अगर आप "रिपोजिटरी" या "डीएओ" के पीछे छिपी इस तरह की मूर्खतापूर्ण धारणाओं का उल्लेख कर रहे हैं, तो मैं सहमत हूं।
क्रिस

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

मैं कोड कन्वेंशन आधारित मैपिंग द्वारा इनबिल्ट का उपयोग करता हूं। यह बकवास का एक बड़ा दल संभालती है जिसे मुझे दोहराना होगा। हालाँकि यह अभी भी प्रदान करने की स्वतंत्रता प्रदान करता है लेकिन विशिष्ट अनुकूलन जो कि कन्वेंशन द्वारा निर्मित मैपिंग पर स्तरित हैं। इसके सुपर सहायक।
सैम

1

इसे अमूर्त करने की कोशिश कर रहा है ताकि आप बाद की तारीख में एंटिटी फ्रेमवर्क (या कुछ और) पर स्विच कर सकें।

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

इसके अलावा, यह आपको NHibernate की उपयोगी और महत्वपूर्ण सुविधाओं जैसे कि दूसरे स्तर के कैशिंग, इंटरसेप्शन, कॉन्करेन्सी मैनेजमेंट, चेंज ट्रैकिंग, प्रीफैच क्वेश्चन इत्यादि का भरपूर उपयोग करने से रोकता है।

अगर वास्तव में NHibernate और Entity फ्रेमवर्क के बीच स्विच करने की एक वैध आवश्यकता थी, तो कई योगदानकर्ताओं और पुल अनुरोधों के साथ GitHub (शायद CommonServiceLocator की समान नस में कुछ) पर इसका समर्थन करने के लिए एक सक्रिय रूप से विकसित परियोजना होगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.