2011-04-18 17 views
9

NHibernate का उपयोग करते समय, यदि मेरे पास ऐसी इकाई है जिसमें अद्वितीय बाधा है और जिसे उस बाधा से अनन्य रूप से पहचाना जा सकता है, तो यह एक समग्र कुंजी के रूप में बाधा का प्रतिनिधित्व करना बेहतर है या एक अलग आईडी है क्षेत्र और एक समग्र अद्वितीय बाधा है? मैं पढ़ रहा हूं कि इसे एनबीबर्ननेट के साथ समग्र कुंजी का उपयोग करने के लिए "बुरा" माना जाता है यदि यह मदद कर सकता है और केवल विरासत डेटाबेस के साथ काम करते समय उपयोग किया जाना चाहिए।NHibernate समग्र कुंजी बनाम समग्र अद्वितीय प्रतिबंध

छवि सेटअप इस प्रकार है:

class Book 
{ 
    public virtual int Id { get; protected set; } 
    public virtual string Author { get; set; } 
    public virtual IList<BookEdition> Editions { get; set; } //HasMany (one to many) 
} 

class BookEdition 
{ 
    public virtual string Title { get; set; } 
    public virtual string Language { get; set; } 
    public virtual int Edition { get; set; } 
} 

यहाँ हम BookEdition जहां यह भाषा और संस्करण की कोई समस्या नहीं है के लिए एक बाधा है, यानी वहाँ नहीं पुस्तक के दो संस्करण ही में हो सकता है भाषा। किसी भी संस्करण को एक संस्करण संख्या और एक भाषा द्वारा विशिष्ट रूप से पहचाना जा सकता है।

एनएचबेरनेट में कौन सा दृष्टिकोण बेहतर माना जाता है? भाषा आईडी को एक समग्र आईडी के रूप में उपयोग करें या BookEdition के लिए एक आईडी चर प्रस्तुत करें और इसके बजाय एक समग्र अद्वितीय बाधा है?

उत्तर

9

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

यह संयुक्त अद्वितीय बाधा के साथ BookEdition की FNH मानचित्रण हो सकता है:

Id(x => x.Id); 
    Map(x => x.Title); 
    Map(x => x.Language).UniqueKey("MyCompositeUniqueConstraint"); 
    Map(x => x.Edition).UniqueKey("MyCompositeUniqueConstraint"); 

Btw। ग्राहकों को surrorgate कुंजी मूल्य दिखाने के लिए यह अच्छा अभ्यास है। वे उन्हें कुछ व्यवसाय का अर्थ देते हैं और फिर वे उन्हें भी बदलना चाहते हैं :)।

+0

यह मैपिंग था जो मैं भी सोच रहा था। क्या प्राकृतिक कुंजी का उपयोग करने के लिए बराबर/गेटहाशकोड को ओवरराइड करना अच्छा विचार है? मेरी बेस क्लास में मेरे पास एक समान ऑपरेटर है जो आईडी संपत्ति पर काम करता है लेकिन यह इस मामले के लिए सटीक नहीं है। मुझे लगता है कि "NaturalId()" का उपयोग कर एक यौगिक प्राकृतिक कुंजी भी संभव नहीं है। मैं प्राकृतिक आईडी और एक अनूठी बाधा के बीच अंतर के बारे में बहुत स्पष्ट नहीं हूं, हाइबरनेट शर्तों में .. –

+0

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

+0

हम्म, ऐसा लगता है कि बराबर ओवरराइड करना और इसके परिणामस्वरूप गेटहाशकोड विशेष रूप से आलसी लोडिंग और प्रॉक्सी शामिल होते हैं (http://devlicio.us/blogs/billy_mccafferty/archive/2007/04/25/using-equals- gethashcode-effectively.aspx)। बहुत दिलचस्प, आपके प्रश्न के लिए धन्यवाद, ऐसा लगता है कि मुझे अभी तक एनएच के बारे में कुछ नहीं पता :)। –

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