एनएचबीनेट में उलटा विशेषता


89

मैं व्युत्क्रम विशेषता का उपयोग कैसे करूं? यदि मैं गलत नहीं हूं, तो कई रिश्तों में से एक के लिए व्युत्क्रम विशेषता को सही पर सेट किया जाना चाहिए। कई-से-कई रिश्तों के लिए, इकाई वर्ग व्युत्क्रम विशेषताओं में से एक को सही पर सेट किया जाना चाहिए और दूसरा गलत पर सेट होना चाहिए।

कोई भी इस पर कुछ रोशनी बहा सकता है?


2
आप मेरे उत्तर की जाँच भी कर सकते हैं, " जब व्युत्क्रम का उपयोग करना है =" सत्य | असत्य "," इसी तरह के प्रश्न पर।
डैनियल शिलिंग

जवाबों:


125

व्युत्क्रम विशेषता को सही पर सेट नहीं किया जाना चाहिए ...

आप एसोसिएशन के 'स्वामी' को निर्दिष्ट करने के लिए उलटा विशेषता का उपयोग करते हैं। (एक एसोसिएशन में केवल एक मालिक हो सकता है, इसलिए एक छोर को उलटा करने के लिए सेट किया जाना चाहिए, दूसरे को 'गैर व्युत्क्रम' पर सेट करना होगा)। (स्वामी: inverse=falseगैर-मालिक: inverse=true)

एक-से-कई एसोसिएशन में, यदि आप संग्रह को उलटा अंत के रूप में चिह्नित नहीं करते हैं, तो NHibernate एक अतिरिक्त अद्यतन करेगा। वास्तव में, इस मामले में, NHibernate पहले संग्रह में निहित इकाई को सम्मिलित करेगा, यदि आवश्यक हो तो संग्रह का स्वामित्व रखने वाली इकाई डालें, और बाद में, 'संग्रह इकाई' को अपडेट करता है, ताकि विदेशी कुंजी सेट हो जाए और एसोसिएशन से बना। (ध्यान दें कि इसका मतलब यह भी है कि आपके DB में विदेशी कुंजी अशक्त होनी चाहिए)।

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

तो, एक द्वि-दिशात्मक संघ में, आपके पास हमेशा एक व्युत्क्रम अंत होता है।


4
यह सब कुछ बस मालिक को जोड़ने के लिए समझाता है कि मेज में विदेशी कुंजी है
बृजेश मिश्रा

48
मेरी राय में यह वास्तव में बुरी शब्दावली है। क्यों नहीं 'उलटा' के बजाय स्वामित्व को चिह्नित करें ?!
UpTheCreek

1
पहले से ही उपेक्षित शब्द पर निषेध का उपयोग करने के लिए :) :) "INVERSE विशेषता को सही पर सेट नहीं किया जाना चाहिए"
contactmatt

अच्छा जवाब, एक ही सवाल शेष है कि यह कैसे तय किया जाए कि "मालिक" कौन होना चाहिए
पांडा

जब आपके पास 2 टेबल के बीच संबंध रखने वाली एक मध्य तालिका होती है, तो कई-से-कई के बारे में क्या?
Dark_Knight

10

उपरोक्त उत्तर के अलावा , और मेरी समझ के अनुसार, आपको संग्रह में विदेशी कुंजी मान को मैन्युअल रूप से जारी रखने की आवश्यकता है, यदि आप अतिरिक्त अपडेट स्टेटमेंट नहीं चाहते हैं:

Parent par = Session.Get<Parent>(8);

Child ch = new Child();
ch.Name = "Emad";

//set the parent foreign key manually
ch.MyParent = par;

par.MyChildren.Add(ch);
Session.Save(par);

व्युत्क्रम विशेषता के और स्पष्टीकरण के लिए, निम्नलिखित पोस्ट की जाँच करें:

http://www.emadashi.com/index.php/2008/08/nhibernate-inverse-attribute/


2

मैं देख सकता हूं कि "मालिक" कहां आता है, लेकिन एक एसोसिएशन एक पाइप है, और आप नीचे या तो अंत देख सकते हैं, इसलिए यह कहने के लिए कि कौन सी इकाई पाइप का मालिक है।

इसे देखने का एक अलग तरीका यह है कि एक से कई रिश्तों में, वास्तव में 2 रिश्ते चल रहे हैं।

संबंध 1: कई बच्चों के माता-पिता।

संबंध 2: प्रत्येक बच्चा एक अभिभावक के लिए

इसलिए NH, DB में इनमें से प्रत्येक को संग्रहीत करने के लिए sql चलाने का प्रयास करेगा। लेकिन इसकी आवश्यकता नहीं है क्योंकि जब आप किसी बच्चे को संग्रहीत करते समय संबंध कुंजी 2 में विदेशी कुंजी सेट करते हैं, तो यह स्वचालित रूप से बच्चे के लिए एक माता-पिता के रिश्ते को भी तय कर देता है क्योंकि संबंध 1 संबंध 2 का "उलटा" है ।

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

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

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