c# - NHibernate return duplicate entities while parent is referenced by more than one property -
पर्यावरण: NHibernate (3.3.3.4001), फ्लुंट एनहाइबरनेट (1.4.0.0) नीचे फ्लुंट एन हाइबरनेट मैपिंग है:
सार्वजनिक वर्ग ग्राहकमैप: क्लासमार्क & lt; ग्राहक & gt; {सार्वजनिक ग्राहकमैप () {आईडी (x = & gt; x.Id); मानचित्र (x = & gt; x.Name)। नॉट.अब (); HasMany (x = & gt; x.Orders)। केकॉल्यूम ("ग्राहक आईडी") .Cascade.All () .LazyLoad (); HasMany (x = & gt; x.Cards)। केकॉल्यूम ("ग्राहक आईडी") .Cascade.All () .LazyLoad (); }} सार्वजनिक वर्ग ऑर्डरमैक्स: क्लासमार्क & lt; आदेश & gt; {सार्वजनिक ऑर्डरमैप () {आईडी (x = & gt; x.Id); मानचित्र (x = & gt; x.OrderTime) .नहीं। (); संदर्भ & lt; ग्राहक & gt; (x = & gt; x ऑर्डर ओनेंर)। लेज़ीलोड ()। कॉलम ("ग्राहक आईडी"); }} पब्लिक क्लास कार्डमैप: कक्षामैप & lt; कार्ड & gt; {सार्वजनिक कार्डमैप () {आईडी (x = & gt; x.Id); मानचित्र (x = & gt; x.CardCode) .Not.Nullable (); संदर्भ & lt; ग्राहक & gt; (x = & gt; x कार्डडाउनर)। लेज़ीलोड ()। कॉलम ("ग्राहक आईडी"); }} इकाई:
सार्वजनिक वर्ग ग्राहक {सार्वजनिक वर्चुअल इन्ट आईडी (get; सेट; } सार्वजनिक वर्चुअल स्ट्रिंग Name {get; सेट; } सार्वजनिक वर्चुअल आइलिस्ट & lt; आदेश & gt; आदेश {प्राप्त; सेट; } सार्वजनिक वर्चुअल आइलिस्ट & lt; कार्ड & gt; कार्ड {प्राप्त; सेट; }} सार्वजनिक वर्ग आदेश {सार्वजनिक वर्चुअल इन्ट आईडी (get; सेट; } सार्वजनिक आभासी दिनांक समय आदेशटाइम {प्राप्त; सेट; } सार्वजनिक आभासी ग्राहक आर्डर आदेश (प्राप्त करें); सेट; }} सार्वजनिक वर्ग कार्ड {सार्वजनिक वर्चुअल इन्ट आईडी (get; सेट; } सार्वजनिक वर्चुअल स्ट्रिंग CardCode {get; सेट; } सार्वजनिक वर्चुअल ग्राहक कार्डोनर {प्राप्त; सेट; }} अब मेरे डेटाबेस में ग्राहक तालिका
आईडी का नाम 1 एएए 2 बीबीबी आदेश तालिका
आईडी आदेश समय ग्राहक आईडी 1 2014-04-20 00: 48: 52.110 1 2 2014-04- 20 00: 48: 52.110 2 3 2014-04-20 00: 49: 01.403 1 4 2014-04-20 00: 49: 01.403 1 कार्ड तालिका <प्री> आईडी कार्डकोड ग्राहक आईडी 1 111 1 2 111 2 5 222 1 6 333 1
जब मैंने मापदंड और FetchMode का इस्तेमाल किया आलसी डेटा प्राप्त करने के लिए जुड़ें, परिणाम में डुप्लिकेट ऑर्डर होगा और कार्ड ग्राहक का था। ग्राहक आईडी = 1 के रूप में, इसमें 9 (3Ã? 3) ऑर्डर ऑब्जेक्ट और 9 (3 ± 3) कार्ड ऑब्जेक्ट हैं।
इएसेशन सत्र = फ्लुअली एनएच मैनेजर .OpenSession (); आईसीआरटीरिया ग्राहक रेटिंग = सत्र। तैयार करेंक्रेताइया & lt; ग्राहक & gt; () .सेटफेट मॉोड ("ऑर्डर", फ़ेचमोडा.जोइन्) .सेटफेट मोोड ("कार्ड", फ़ेचमोडा.जेयन) .SetResultTransformer (ट्रांसफॉर्मर्स। डिस्टिंकरूटएन्टीटी); IList & LT; ग्राहक & gt; ग्राहक सूची = ग्राहक अनुशंसा। सूची & lt; ग्राहक & gt; (); लेकिन अगर मैं डेटा प्राप्त करने के लिए HQL का उपयोग किया है, तो यह सही है। ग्राहक आईडी = 1 में 3 ऑर्डर ऑब्जेक्ट्स और 3 कार्ड ऑब्जेक्ट्स हैं।
इएसेशन सत्र = फ्लुअलीएनएचएमएनेगर। ओपनसेशन (); आईसीआरटीरिया ग्राहक रेटिंग = सत्र। तैयार करेंक्रेताइया & lt; ग्राहक & gt; ("ग्राहक सी से" चले जाने के आदेशों को छोड़ें ओ कार्ड लेने में शामिल हों "c"); IList & LT; ग्राहक & gt; ग्राहक सूची = ग्राहक अनुशंसा। सूची & lt; ग्राहक & gt; (); मापदंड के बारे में समस्या को ठीक करने के लिए मैं क्या कोड कर सकता हूं? क्यों यह गलत परिणाम है?
जैसा कि इस दिलचस्प रीडिंग में बताया गया है: Ayende -: < blockquote>
उन चीजों में से एक जो अक्सर पॉप अप लगता है कि लोग अपनी संस्थाओं को बेसब्री से लोड करने की इच्छा रखते हैं यह बहुत आसान है जब संगठन कई-से-एक होते हैं (अर्थात, इनमें से केवल एक रूट इकाई है)। उन लोगों का उदाहरण स्वामी, साइट आदि जैसी चीजें होगी।
...
समस्या तब शुरू होती है जब आप एक से अधिक संग्रह संगठनों के लिए ऐसा करने की कोशिश करते हैं। NHibernate आपको ऐसा करने की अनुमति देता है, लेकिन नतीजा यह संभवतः नहीं है कि आप शुरू में क्या उम्मीद करेंगे ...
कुछ सामान्य तरीके हैं, कृपया जांचें:
-
विस्तृत कैसे यहां पाया जा सकता है:
-
नोट: यदि आपने बच्चे और अन्य बच्चे और ... विशिष्ट रूट परिवर्तन नौकरी नहीं करेगा, क्योंकि यह केवल एक रूट के लिए करता है ... < / p>
मेरा पसंदीदा तरीका है: सरल क्वेरी को केवल कई-से-एक संदर्भों में शामिल होने के लिए बनाएं। बैच-आकार सुविधा ()
xml:
// class धाराप्रवाह:
। बैचसिसेज (25 ) -
-
-
Comments
Post a Comment