मुझे लगता है कि संस्थाओं डिफ़ॉल्ट के रूप में प्राथमिक कुंजी तुलना द्वारा समानता को लागू करना चाहिए, लेकिन nhibernate प्रलेखन व्यापार पहचान का उपयोग की सिफारिश की: पहचानकर्ता मूल्य की तुलना द्वाराnhibernate: समानता को लागू करने के लिए सर्वोत्तम प्रथाएं क्या हैं?
सबसे स्पष्ट रास्ता बराबर लागू करने के लिए है()/GetHashCode() दोनों वस्तुओं के। यदि मान समान है, तो दोनों एक ही डेटाबेस पंक्ति होनी चाहिए, इसलिए वे बराबर हैं (यदि दोनों को आईसेट में जोड़ा जाता है, तो हमारे पास केवल आईएसईटी में एक तत्व होगा)। दुर्भाग्यवश, हम उस दृष्टिकोण का उपयोग नहीं कर सकते हैं। NHibernate केवल उन वस्तुओं को पहचानकर्ता मान निर्दिष्ट करेगा जो लगातार हैं, एक नव निर्मित उदाहरण में कोई पहचानकर्ता मूल्य नहीं होगा! हम व्यापार कुंजी समानता का उपयोग कर बराबर() और GetHashCode() को लागू करने की सलाह देते हैं।
व्यापार कुंजी समानता का मतलब है कि बराबर() विधि उन लक्षणों को व्यापार कुंजी, एक महत्वपूर्ण यह है कि असली दुनिया में हमारे उदाहरण की पहचान हैं (एक प्राकृतिक उम्मीदवार कुंजी)
और उदाहरण के रूप में तुलना (यह भी दस्तावेज़ से):
public override bool Equals(object other)
{
if (this == other) return true;
Cat cat = other as Cat;
if (cat == null) return false; // null or not a cat
if (Name != cat.Name) return false;
if (!Birthday.Equals(cat.Birthday)) return false;
return true;
}
यह मिल गया मेरे सिर क्योंकि व्यापार की पहचान की धारणा (उदाहरण के अनुसार) कताई वाक्य रचना से तुलना, जो मूल रूप से अर्थ विज्ञान के प्रकार मैं ValueObjects के साथ जोड़ते है के रूप में ही है । तुलनात्मक मानों के रूप में डेटाबेस प्राथमिक कुंजी का उपयोग न करने का कारण यह है क्योंकि यह क्लाइंट साइड (पूर्व वृद्धिशील के लिए) पर प्राथमिक कुंजी उत्पन्न नहीं होने पर ऑब्जेक्ट के हैशकोड को बदल देगा और आप किसी प्रकार के हैशटेबल संग्रह (जैसे आईसेट) का उपयोग करते हैं। अपनी संस्थाओं को संग्रहित करने के लिए।
मैं एक समान समानता कार्यान्वयन कैसे बना सकता हूं जो समानता/हैशकोड (http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx) के सामान्य नियमों को तोड़ता नहीं है और न ही निषेध नियमों के अनुरूप है?
आप (विशेष रूप से) बराबर का उपयोग क्यों करना चाहते हैं? – apollodude217