एनबीबेर्नेट में कई-से-एक संबंधों का मॉडल करने का सबसे अच्छा तरीका जब विरासत डीबी से निपटना है?

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

0
ro fr bn

6 उत्तर

मुझे लगता है कि आपके पास यहां की समस्या यह है कि आपकी स्वीकृत ऑफ़र ऑब्जेक्ट में एक प्लान ऑब्जेक्ट होता है, और फिर आपकी प्लान ऑब्जेक्ट में एक स्वीकृत ऑफ़र्स संग्रह होता है जिसमें स्वीकृत ऑफर ऑब्जेक्ट होते हैं। ग्राहकों के साथ वही बात। तथ्य यह है कि वस्तुएं एक-दूसरे के बच्चे हैं, जो आपकी समस्या का कारण बनती हैं, मुझे लगता है।

इसी प्रकार, आपके स्वीकृत ऑफ़र कॉम्प्लेक्स को क्या बनाता है इसकी दो जिम्मेदारियां होती हैं: यह किसी योजना में शामिल ऑफ़र इंगित करती है, यह किसी ग्राहक द्वारा स्वीकृति दर्शाती है। वह एकल जिम्मेदारी सिद्धांत का उल्लंघन करता है।

आपको एक योजना के तहत एक प्रस्ताव के बीच अंतर करना पड़ सकता है, और एक प्रस्ताव जिसे ग्राहकों द्वारा स्वीकार किया जाता है। तो यहां मैं क्या करने जा रहा हूं:

  1. एक अलग ऑफ़र ऑब्जेक्ट बनाएं जिसमें राज्य नहीं है, उदाहरण के लिए, इसमें कोई ग्राहक नहीं है और इसकी कोई स्थिति नहीं है - इसमें केवल एक ऑफर आईडी है और यह योजना इसके गुणों के रूप में है।
  2. ऑफ़र संग्रह के लिए अपनी योजना ऑब्जेक्ट को संशोधित करें (इसे इसके संदर्भ में ऑफ़र स्वीकार नहीं किया गया है)।
  3. अंत में, अपने स्वीकृत ऑफर ऑब्जेक्ट को संशोधित करें ताकि इसमें एक ऑफ़र, ग्राहक और स्थिति हो। ग्राहक वही रहता है।

मुझे लगता है कि यह आपके एनएचबीर्नेट मैपिंग्स और ऑब्जेक्ट सेविंग समस्याओं को पर्याप्त रूप से उलझाएगा। :)

0
जोड़ा

एक युक्ति जो NHibernate में सहायक हो सकती है (या नहीं): आप दृश्यों के खिलाफ अपनी ऑब्जेक्ट्स को मैप कर सकते हैं जैसे कि दृश्य एक तालिका थी। बस नाम का नाम तालिका नाम के रूप में निर्दिष्ट करें; जब तक सभी नल फ़ील्ड दृश्य में शामिल नहीं होते हैं और मैपिंग यह ठीक काम करेगा।

0
जोड़ा

मुझे नहीं पता कि यह संभवतः क्यों है क्योंकि मेरा एनएचबीर्नेट अनुभव सीमित है, लेकिन क्या आप बेसडैंच क्लास बना सकते हैं जिसमें विवरण के लिए केवल गुण हैं क्योंकि वे सीधे विवरण तालिका में मैप करते हैं।

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

मुझे नहीं पता कि क्या यह पूरी तरह से समझ में आता है, लेकिन मुझे बताएं और मैं आगे स्पष्टीकरण दूंगा।

0
जोड़ा

जिस मॉडल को मैं मॉडल में लेता हूं वह इस प्रकार है:

Customer object contains an ICollection PaymentPlans which represent the plans that customer has accepted.

ग्राहक को पेमेंटप्लान को एक बैग का उपयोग करके मैप किया जाएगा जो विवरण तालिका का उपयोग करता है ताकि यह निर्धारित किया जा सके कि कौन से ग्राहक आईडी मैप किए गए हैं जो भुगतान प्लान हैं। कैस्केड ऑल-डिलीट-अनाथ का उपयोग करना, अगर ग्राहक हटा दिया गया था, तो विवरण से प्रविष्टियां और ग्राहक स्वामित्व वाले भुगतान प्लान हटा दिए जाएंगे।

पेमेंटप्लान ऑब्जेक्ट में प्लानटेम्स ऑब्जेक्ट होता है जो भुगतान योजना की शर्तों का प्रतिनिधित्व करता है।

प्लानटर्म को पेमेंटप्लान में मैप किए जा रहे एक से-एक मैपिंग कैस्केडिंग सेव-अपडेट का उपयोग करके मैप किया जाएगा जो केवल प्लानप्लान में प्रासंगिक प्लानटेम्स ऑब्जेक्ट का संदर्भ डालेगा।

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

आप एक ग्राहक ऑब्जेक्ट, एक भुगतान प्लान ऑब्जेक्ट और एक प्लानटार्म ऑब्जेक्ट के साथ समाप्त हो जाएंगे जिसमें ग्राहक (ग्राहक तालिका) के साथ भुगतान प्लान (विवरण तालिका) के उदाहरण हैं, जो सभी विशिष्ट प्लानटेम्स (योजना तालिका) का पालन करते हैं।

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

0
जोड़ा

मैं अपने लॉजिकल पैरेंट वाले बच्चे ऑब्जेक्ट से दूर रहूंगा, जब आप ऐसा करते हैं तो यह बहुत गन्दा और बहुत तेज़ हो सकता है। मैं इस तरह की चीज करने से पहले डोमेन मॉडल का उपयोग करने का इरादा रखता हूं, इस पर एक नज़र डालेंगे। आप टेबल में आईडी संदर्भों को आसानी से अभी भी प्राप्त कर सकते हैं और उन्हें अनदेखा छोड़ सकते हैं।

यहां दो उदाहरण मैपिंग हैं जो आपको सही दिशा में घुमा सकते हैं, मुझे टेबल नाम आदि को एडिलिब करना पड़ता है लेकिन यह संभवतः मदद कर सकता है। मैं शायद एक गणना के लिए StatusId मैपिंग का सुझाव भी दूंगा।

बैग को प्रभावी रूप से विवरण तालिका में संग्रह तालिका को मानचित्रित करने के तरीके पर ध्यान दें।

<?xml version="1.0" encoding="utf-8" ?>

    
        
            
            
        

        
          
          
        

  



<?xml version="1.0" encoding="utf-8" ?>

    
        
            
            
        

        
        
        

        
            
        

  

0
जोड़ा

जब मैं लिख रहा था तब आपका डेटाबेस आरेख नहीं देखा।

<?xml version="1.0" encoding="utf-8" ?>

    
        
            
            
        

        
            
            
        

  



<?xml version="1.0" encoding="utf-8" ?>

    
        
            
            
        

        
            
        

  

शायद चाल चलाना चाहिए (मैंने केवल संग्रह के लिए उदाहरण मैपिंग किया है, आपको अन्य गुणों को जोड़ना होगा)।

0
जोड़ा