2009-09-04 17 views
7

को सहेजने या अपडेट करने के लिए कॉल के बिना डीबी परिवर्तनों को प्रतिबद्ध किया है, मैं एएसपी.नेट में निबर्ननेट 2.0 का उपयोग करता हूं। मैं पृष्ठ की भिक्षा पर लेनदेन शुरू करता हूं और अंत में लेनदेन करता हूं। पेज के दौरान: - मैं एक वस्तु मिल - मैं वस्तु संपत्ति बदल - मैं वस्तु मान्य - अगर मान्यता गलत है मैं किसी भी नहीं बनाते हैं - अगर मान्यता ठीक है मुझे लगता है कि वस्तु को बचाने के अद्यतन फोन उस ऑब्जेक्ट पर सहेजने के लिए कॉल करें - मैं हमेशा पृष्ठ के अंत में लेनदेन करता हूं।एनएचबीर्नेट ने

समस्या यह है कि जब सत्यापन गलत होता है और मैं ऑब्जेक्ट पर सहेजने के लिए कोई कॉल नहीं करता हूं तो प्रतिबद्ध ट्रांजैक्टिन डीबी में परिवर्तन करता है।

मैंने फ्लशमोड को कभी भी नहीं बदला लेकिन परिवर्तन को बदल दिया।

सुझाव है? मुझे क्या गलती है?

+0

क्या आप NHibernate सत्यापन ढांचे का उपयोग कर रहे हैं? – mxmissile

उत्तर

17

पेज के दौरान: - मैं एक वस्तु

मिल आप एक सत्र से एक वस्तु मिल तो आप अद्यतन गलतफहमी रहे हैं। एक मौजूदा इकाई को एक सत्र में जोड़ने के लिए अद्यतन है। यदि आपको किसी सत्र से कोई इकाई मिलती है तो यह पहले से ही उस सत्र से जुड़ा हुआ है, इसलिए अद्यतन व्यर्थ है।

इस मामले में SaveOrUpdate बनाम अद्यतन कोई फर्क नहीं पड़ता - एक ही बात।

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

अन्य ओआरएम की आवश्यकता हो सकती है कि आप स्वयं परिवर्तनों को ट्रैक करें और किसी भी ऑब्जेक्ट पर स्पष्ट रूप से कुछ प्रकार के अपडेट को कॉल करें जिसे आप जारी रखना चाहते हैं, लेकिन एनएच इस तरह से काम नहीं करता है।

तो अपने प्रश्न का उत्तर देने के लिए, यदि सत्यापन विफल रहता है तो आप लेनदेन को नहीं करना चाहते हैं।

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

5

मैं बस इसी समस्या में भाग गया। आइस्टन का जवाब बहुत उपयोगी था, यह बताते हुए कि इससे कोई फर्क नहीं पड़ता कि आप ISession को कॉल करते हैं या नहीं। अद्यतन (ऑब्जेक्ट) या SaveOrUpdate (ऑब्जेक्ट), एनएच परिवर्तनों को ट्रैक करता है, और लेनदेन करने से परिवर्तन किए जाएंगे।

डेटाबेस में होने वाले परिवर्तनों को रोकने के लिए, आप अपने सत्यापन को पूरा करने के कुछ तरीके हैं। एक अलग लेनदेन में अपनी सभी सत्यापन और (संभव) बचत करना।

using (ITransaction tx = session.BeginTransaction()) 
{ 
    // get your object 
    // do your validation 

    // if you pass validation: 
    tx.Commit(); 

    // if not, roll it back 
    tx.Rollback(); 
} 

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

if (!myObj.ValidateForSave()) 
{ 
    session.Evict(myObj); 
} 

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

+4

यदि आपके पास असफल सत्यापन है, तो आपको अपना लेनदेन वापस लेना चाहिए, इसे प्रतिबद्ध नहीं करना चाहिए। यदि आप एक ही वस्तु को बेदखल करते हैं, तो सत्र में अन्य वस्तुओं में किए गए परिवर्तन अभी भी किए जाएंगे और यह एक परमाणु संचालन के लेनदेन के अनाज के खिलाफ चला जाता है - यह "सब कुछ या कुछ नहीं होना चाहिए"। –

1

समाधान कि इस मामले में मेरे लिए काम करता है:

  1. 'कमिट' करने के लिए सत्र FlushMode सेट करें।

  2. निकालें वस्तु पर इन-स्मृति अपडेट निपटने कोड में 'फ्लश' के सभी संदर्भ।

  3. 'बचत' करते समय प्रति सत्र केवल 1 लेनदेन खोलें और फिर उस सत्र को त्याग दें।

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