2009-04-03 13 views
82

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

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

+2

आप मेरे उत्तर की जांच भी कर सकते हैं, "[इनवर्स =" सच | झूठी "] (http://stackoverflow.com/a/6951546/221708) का उपयोग करने के लिए," इसी तरह के प्रश्न पर। –

उत्तर

114

उलटा विशेषता सही पर सेट नहीं किया जाना चाहिए ...

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

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

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

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

+4

यह सब कुछ बताता है कि मालिक को जोड़ने के लिए वह है जिसमें तालिका –

+3

में विदेशी कुंजी है http://tadtech.blogspot.com/2007/02/hibernate-when-is-inversetrue-and-when.html –

+42

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

8

the answer above के अलावा, और मेरी समझ के अनुसार, आप संग्रह मैन्युअल रूप में विदेशी कुंजी मान लागू करने के लिए की जरूरत है, वह यह है कि अगर आप अतिरिक्त अद्यतन बयान नहीं करना चाहती:

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: एक जनक के लिए प्रत्येक बच्चे

तो राष्ट्रीय राजमार्ग डीबी इनमें से प्रत्येक में स्टोर करने के लिए एसक्यूएल को चलाने के लिए प्रयास करेंगे। लेकिन इसकी आवश्यकता नहीं है क्योंकि जब आप विदेशी कुंजी सेट करते हैं उदा। रिलेशनशिप 2 में जब कोई बच्चा संग्रहीत होता है, तो यह स्वचालित रूप से बच्चे के साथ माता-पिता के रिश्ते को ठीक कर देता है क्योंकि रिलेशनशिप 1 रिलेशनशिप 2 का "उलटा" है।

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

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