2009-04-20 11 views
6

मुझे काफी समय लगा लेकिन मुझे अंत में काम करने के लिए nHibernate की हैलो वर्ल्ड मिली। यह "आलसी लोडिंग" करने के बाद काम किया। ईमानदारी से, मैं आपको नहीं बता सका कि यह सब क्यों काम करता है, लेकिन ऐसा हुआ और अब मैं पढ़ रहा हूं कि आपको आलसी लोडिंग की आवश्यकता नहीं है। क्या कोई हैलो दुनिया है कि किसी के पास यह है कि वह नंगे हड्डियों को nHibernate काम कर रही है? क्या आपको आलसी लोडिंग होनी है? मैं पूछता हूं क्योंकि मैं nHibernate का उपयोग करना चाहता हूं लेकिन मुझे समझने की जरूरत है कि चीजें कैसे काम कर रही हैं।क्या आलसी लोडिंग nHibernate के लिए आवश्यक है?

धन्यवाद।

क्या आप एक ऐसे संसार की दुनिया के बारे में जानते हैं जिसके पास इतना अधिक उपर नहीं है?

आलसी लोडिंग का उपयोग करना बेहतर है?

संपादित करें: मैं एएसपीनेट 3.5 का उपयोग कर रहा हूं। वेब अनुप्रयोग परियोजना।

+0

मेरे उत्तर में एक और अनुभाग जोड़ा गया। –

उत्तर

22

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

दो प्रकार की आलसी लोडिंग हैं: अन्य संस्थाओं और सूचियों के संदर्भों के लिए।

इस इकाई को देखते हुए:

class Entity 
{ 
    // pk 
    int id { get; private set; } 

    // reference to another entity 
    User MyUser { get; set; } 

    // list to other entities 
    IList<Comments> MyComments { get; set; } 
} 

लेज़ी उपयोगकर्ता

के संदर्भ पर लोड हो रहा है आप उपयोगकर्ता पर आलसी लोड हो रहा है है, तो आप उपयोगकर्ता वर्ग आभासी के सभी सदस्यों को परिभाषित करने की जरूरत। NHibernate एक तथाकथित प्रॉक्सी बना देगा। प्रॉक्सी रनटाइम पर परिभाषित एक वर्गीकृत है जो उपयोगकर्ता से प्राप्त होता है। आपका कोड इसे उपयोगकर्ता के रूप में एक्सेस कर रहा है और यह पता नहीं है कि उप-वर्ग है। लेकिन जब आप पहली बार अपने सदस्यों में से किसी एक तक पहुंचते हैं, तो गुण डेटाबेस से लोड होते हैं।

आप उपयोगकर्ता वर्ग पर आलसी लोड हो रहा है बंद करना चाहते हैं, तो आप अपने मानचित्रण में ऐसा करने की जरूरत:

<class name="User" lazy="false"> ... 

तो NHibernate हमेशा बनाता है के प्रकार के उपयोगकर्ता, कोई प्रॉक्सी उदाहरणों। आपको वर्चुअल कुछ भी करने की आवश्यकता नहीं है।

लेज़ी टिप्पणी

आप टिप्पणी की सूची पर आलसी लोड हो रहा है का उपयोग करते हैं की सूची पर लोड हो रहा है, यह सूची ही है कि आलसी लोड हो रहा है लागू करता है। यदि आप पहली बार सूची तक पहुंचते हैं, तो यह डेटाबेस से लोड होता है। NHibernate एक सूची का उपयोग करता है जो IList लागू करता है, लेकिन सूची नहीं है।

आप सूची में आलसी लोड हो रहा है बंद करना चाहते हैं, तो आप इकाई की मैपिंग में ऐसा करते हैं:

<class name="Entity"> 
    <bag name="MyComments" lazy="false" > 
     ... 

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

तो कॉन्फ़िगरेशन सावधानीपूर्वक करने की आवश्यकता है।


संपादित करें:

अपने मूल सवाल का जवाब करने के लिए: आलसी लोड हो रहा है NHibernate के लिए की आवश्यकता है? नहीं, लेकिन: क्या मेरे आवेदन में आलसी लोडिंग आवश्यक है? शायद हां।

मुझे लगता है कि केवल छोटे और छोटे छोटे अनुप्रयोगों को आलसी लोडिंग की आवश्यकता नहीं है। यदि आपके पास कई लगातार कक्षाओं के साथ एक प्रणाली है, तो आपको आलसी लोडिंग की आवश्यकता होगी।

+0

एनएच संदर्भ डॉक्टर पूरी तरह से '' के साथ विरोधाभास करता है 'चूंकि आलसी प्रारंभिकता से बग का कारण बन सकता है [...], गैर आलस्य डिफ़ॉल्ट है। "और' "एनएचबर्ननेट संग्रह के लिए आलसी चयन लाने और आलसी के लिए आलसी प्रॉक्सी लाने के लिए आलसी चयन का उपयोग करता है। मूल्यवान संघ। '"- संग्रह के लिए –

+0

@ क्रिस: पहला वाक्य पुराना है। आलसी संस्करण के बाद डिफ़ॉल्ट है (i-dont-know)। दूसरा कथन वह है जिसे मैंने वास्तव में समझाने की कोशिश की। –

7

यदि आप lazy="false" को <class> तत्व में जोड़ने के लिए hbm.xml फ़ाइलों का उपयोग कर रहे हैं तो आप सभी साधारण गुणों के लिए गैर-आलसी लोडिंग प्राप्त करेंगे। विदेशी संस्थाएं अभी भी डिफ़ॉल्ट रूप से आलसी हो जाएंगी। मैपिंग तत्व में lazy="false" को उत्सुक बनाने के लिए। उत्सुक लोडिंग का एक लाभ यह है कि अब आपको अपनी इकाई कक्षाओं पर वर्चुअल गुणों की आवश्यकता नहीं होगी।

संपादित करें: यदि आप वास्तव में देखना चाहते हैं कि दृश्यों के पीछे क्या हो रहा है, तो NHibernate log4net का उपयोग करके सबकुछ लॉग करता है। अपने web.config में

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    <!-- Rest of config sections here --> 
</configSections> 
<log4net> 
    <appender name="SQLFileAppender" type="log4net.Appender.RollingFileAppender, log4net"> 
    <param name="File" value="C:\Logs\SQL.log" /> 
    <param name="AppendToFile" value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%date [%thread] %-5level %logger - %message%newline" /> 
    </layout> 
    </appender> 
    <logger name="NHibernate.SQL" additivity="false"> 
    <level value="DEBUG" /> 
    <appender-ref ref="SQLFileAppender" /> 
    </logger> 
</log4net> 

<configuration> अंदर जोड़ना थूक होगा सभी एसक्यूएल NHibernate फ़ाइल c:\logs\sql.log

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