2009-12-15 16 views
9

में उत्सुक चयन करने के लिए मजबूर करें, मैं उत्सुकता से चयन का उपयोग करके संग्रह लाने की कोशिश कर रहा हूं, लेकिन मैं प्राप्त कर रहा हूं आंतरिक जुड़ता है। क्या हो रहा है?NHibernate

Session.CreateCriteria(typeof(Foo)) 
    .SetFetchMode("Bars", FetchMode.Select) 
    .CreateAlias("Bars", "b") 
    .SetFetchMode("b.Bazes", FetchMode.Select) 
    .List(); 

मैं उत्सुक करने के लिए FetchMode बदलते की कोशिश की है, लेकिन वह काम नहीं करता - मैं अभी भी भीतरी अलग चयन के बजाय मिलती मिल । मुझे यकीन नहीं है कि यह आंतरिक रूप से यहां से जुड़ रहा है, क्योंकि दस्तावेज़ों में कुछ भी FetchMode के बारे में बात करता है जिससे आंतरिक जुड़ता है। क्या उत्सुक चयन करना संभव है?

अद्यतन ठीक है मैंने काम किया है कि एक उपनाम बनाने से आंतरिक जुड़ने का कारण बनता है। तो मैं .reateAlias ​​("बार्स", "बी", JoinType.None) का उपयोग कर सकता हूं, लेकिन फिर बी। Bazes लाने की आलसी आलसी लोडिंग में वापस आती है। Urgh।

उत्तर

1

एक इंटर्न जॉइन यह है कि एनएचबीर्नेट आपके रिकॉर्ड और उनके संबंधित बाल रिकॉर्ड कैसे लोड करेगा। यह आमतौर पर ऐसा करने का सबसे प्रभावी तरीका है।

यदि यह एकाधिक चयन विवरणों का उपयोग करना था तो बच्चों के लिए क्वेरी को किसी भी तरह माता-पिता के मानदंडों को शामिल करने की आवश्यकता होगी। एक इंटर्न जॉइन सिर्फ संबंधित बच्चों को प्राप्त करना आसान बनाता है, एनएचबीर्नेट क्वेरी को चलाने के बाद इसे कई इकाइयों में सही ढंग से विभाजित कर देगा।

मेरा मानना ​​है कि एंटीटी फ्रेमवर्क 4 आपको कई प्रश्न पूछने देगा और 'जादुई रूप से संबंधित वस्तुओं को फिर से संलग्न करेगा, लेकिन मुझे इस तरह की सुविधा वाले एनएचबीरनेट के बारे में पता नहीं है (मुझे यकीन है कि अगर कोई मैं सही करूँगा तो मुझे सही करेगा इस पर गलत)।

+0

लेकिन डिफ़ॉल्ट जॉइन प्रकार आमतौर पर बाहरी जुड़ाव छोड़ दिया जाता है, है ना? आंतरिक कुंजी काम नहीं करती है अगर विदेशी कुंजी शून्य है, या मेरे मामले में, जहां बार्स खाली हो सकते हैं। इसके अलावा दस्तावेज़ यह इंगित करते हैं कि आप एक उत्सुक चयन कर सकते हैं। – cbp

0
Session.CreateCriteria(typeof(Foo)) 
    .SetFetchMode("Bars", FetchMode.Select) 
    .CreateAlias("Bars", "b") <-- this line triggers a join (think) 
    .SetFetchMode("b.Bazes", FetchMode.Select) 
    .List(); 

तुम सच में नहीं करना चाहते हैं के जुड़ने पर आपको = मानचित्रण में "का चयन करें" को लाने निर्दिष्ट कर सकते हैं, लेकिन यह एक एन 1 का चयन करें जो अनुशंसित नहीं है का कारण होता है (प्रत्येक फू इकाई के लिए एक का चयन करें, और उसके बाद एक प्रत्येक बज़ के लिए)

1

उत्सुक लोड इकाइयों को निषेध करने के लिए बाहरी जुड़ाव का उपयोग किया जाता है। तो अगर आप इस तरह अपने कोड को बदलने की जरूरत:

Session.CreateCriteria(typeof(Foo)) 
.SetFetchMode("Bars", FetchMode.Select) 
.CreateAlias("Bars", "b", JoinType.LeftOuterJoin) 
.SetFetchMode("b.Bazes", FetchMode.Select) 
.List(); 

यह मेरे similar scenario में मदद की।