2012-11-12 14 views
6

मुझे पता है कि यह पूछा गया है, लेकिन मैं इस समस्या को हल नहीं कर सकता।NHIbernate एक संग्रह को रीफ्रेश करना

आइए कहें कि आपके पास एक निबर्नेट ऑब्जेक्ट है जिसमें संग्रह है।

समस्या यह है कि, संग्रह में कुछ ऑब्जेक्ट डेटाबेस में किसी भिन्न उपयोगकर्ता द्वारा डेटाबेस में अद्यतन किया जाता है (मैं मैन्युअल रूप से डेटाबेस फॉट परीक्षण उद्देश्यों को संशोधित करता हूं), मुझे संग्रह मूल्य को रीफ्रेश करने के लिए निबर्ननेट बनाने का कोई तरीका नहीं दिख रहा है।

मैंने कोशिश की है कि रीफ्रेश, बेदखल, लोडिंग एजिंग ... केवल सत्र को बंद करना और एक नया काम बनाना। लेकिन मुझे यह समाधान समस्याग्रस्त लगता है और, "दोस्त, संग्रह में वस्तुओं को ताज़ा करें" को निषेध करना कितना मुश्किल हो सकता है?

लेकिन किसी भी तरह से मैं इसे काम नहीं कर सकता।

धन्यवाद एक बहुत

+0

आप माता-पिता या बच्चे को हटाना उतना रहे हैं? –

+0

yesssssssssssss। केवल सत्र द्वारा ही किए जाने की संभावनाएं ही काम करती हैं। यदि डेटाबेस में किसी अन्य तरीके से परिवर्तन नहीं किए गए हैं तो –

+0

क्या आप दूसरे स्तर के कैश का उपयोग कर रहे हैं? – csanchez

उत्तर

1

यह वास्तव में काम करने वाला नहीं है, यही कारण है कि यदि ऐसा नहीं होता है।

एनएचबर्ननेट डिफ़ॉल्ट रूप से एक सत्र स्तर कैश का उपयोग करता है, पढ़ने और संशोधनों को ट्रैक करने के लिए।

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

यदि यह किसी वेब ऐप का हिस्सा है, तो यह अनुशंसा की जाती है कि आप "सत्र-प्रति-अनुरोध" दृष्टिकोण का पालन करें।

यदि आप वास्तव में यह काम करना चाहते थे, तो आप संभवत: इकाई से और उसके बच्चों को सत्र से निकाल सकते हैं, फिर से लाने के लिए मजबूर कर सकते हैं, लेकिन यह बुरा है और मैं वास्तव में इसकी सलाह नहीं दूंगा।

+0

मैं नास्टनेस पर सहमत हूं। लेकिन एनएच वास्तव में अच्छा है और इसके पीछे के दोस्त तेज और स्मार्ट हैं। मुझे नहीं लगता कि इस तरह उन्होंने इसका इरादा किया है। –

+0

इकाई का निष्पादन काम नहीं करता है! कोशिश की इससे मुझे संग्रह वस्तुओं को एक-एक करके बेदखल करने के अलावा कोई विकल्प नहीं छोड़ता है। जैसा आपने कहा उतना गंदा एक तरफ ध्यान दें, यह एक डेस्कटॉप ऐप है और कुछ ऑब्जेक्ट्स लंबे समय तक रहते हैं। –

+0

डेस्कटॉप ऐप के रूप में भी, आपको काम की अपनी इकाई को काम करने की आवश्यकता है। यदि यह कैश डेटा है, तो ऑब्जेक्ट को सत्र से डिस्कनेक्ट करें और जब आपको अपडेट करने की आवश्यकता हो तो उन्हें फिर से प्राप्त करें, अन्यथा एकाधिक क्लाइंट में स्टेल डेटा के आधार पर लेखन टकराव होंगे। – DavidWhitney

0

बेदखल करने की कोशिश करने की परेशानी में जाने के बाद, और यहां तक ​​कि उद्घाटन और समापन सत्र भी माना जाता है। ऐसा लगता है कि फ़िल्टर किए गए प्राप्त करने पर विचार करने के लिए आपके कोड में पर्याप्त हेडस्पेस है, यानी संग्रह प्रकार के सभी आइटम प्राप्त करें जहां मूल आईडी आपके मूल ऑब्जेक्ट की है। एनएच के साथ काम करने के तरीके के आधार पर आपको अपने भंडार या दाओ का विस्तार करना पड़ सकता है, लेकिन जैसा कि अन्य ने कहा है, उदाहरण के बिना अधिक विशिष्ट होना मुश्किल है। मुख्य बिंदु यह है कि आप बच्चे के ऑब्जेक्ट को उस प्रकार के क्वेरी में प्राप्त करते हैं, जिसे मूल आईडी द्वारा फ़िल्टर किया जाता है।

यह एक नया प्राप्त होगा, इसलिए आपको किसी अन्य प्रक्रिया द्वारा बनाई गई कोई भी नई या बदली हुई वस्तुएं मिलेंगी, और फिर आप उस संग्रह को अपने मूल ऑब्जेक्ट में संग्रह के रूप में सेट कर सकते हैं। जब आप सहेजने का प्रयास करते हैं तो एनएच को इस पर प्राप्त करना चाहिए क्योंकि यह आपके ऑब्जेक्ट्स के बारे में धारणाएं बना सकता है और उचित रूप से सहेज सकता है या अपडेट कर सकता है। यदि आपके माता-पिता ऑब्जेक्ट को प्राप्त करने और इसे फिर से सहेजने के बीच कुछ समय अंतराल होने की संभावना है तो यह आपके लिए उपयोग किया जा सकता है।

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

+0

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

0

आपको सत्र फ़ैक्टरी कक्षा में IDISpose इंटरफ़ेस को लागू करना चाहिए।

बस इस तरह

:

public class YouSessionFactory : INHibernateSessionFactory, IDisposable 
{ 
    private ISessionFactory _sessionFactory; 

    //codes for initial _sessionFactory, for configuration,mapping or something else. 
    //balalalalalala 
    //.... 

    public ISessionFactory BuildSessionFactory() 
    { 
     return _sessionFactory; 
    } 

    public void Dispose() 
    { 
     if (!_sessionFactory.IsClosed || _sessionFactory != null) 
     { 
      _sessionFactory.Close(); 
      _sessionFactory.Dispose(); 
     } 
    } 
} 
संबंधित मुद्दे