2010-02-11 13 views
5

मैं एक Asp.net एमवीसी अनुप्रयोग में Fluent NHibernate का उपयोग कर रहा हूं। मैंने इसे प्रत्येक अनुरोध पर एक सत्र और लेनदेन शुरू करने के लिए स्थापित किया है, और अनुरोध के अंत में लेनदेन प्रतिबद्ध है। हालांकि, मैं जो करना चाहता हूं वह एक वस्तु को सहेजना है (इस मामले में, एक नई "कंपनी") और फिर उस नई कंपनी के विवरण पृष्ठ पर रीडायरेक्ट करें। मैं नई कंपनी का आईडी कैसे प्राप्त करूं ताकि मैं रीडायरेक्ट कर सकूं? अगर मुझे सत्र के बाद आईडी मिलती है। बचाओ (कंपनी), यह शून्य है। यह समझ में आता है क्योंकि यह अभी तक प्रतिबद्ध नहीं हुआ है, हालांकि, ऐसा लगता है कि वर्तमान लेनदेन के बिना और एक नया शुरू करने के बिना ऐसा करने का अपेक्षाकृत आसान तरीका होना चाहिए।Fluent NHibernate सहेजे गए ऑब्जेक्ट के आईडी प्राप्त करें

+1

सत्र सत्र के बाद आपको आईडी प्राप्त करने में सक्षम होना चाहिए। आप किस आईडी प्रकार का उपयोग कर रहे हैं? –

+0

नई पंक्ति आईडी मान प्राप्त करने के लिए आप किस निर्देश या कोड का उपयोग करते हैं? मैं एक पहचान क्षेत्र के साथ एक तालिका में पंक्तियों को सहेज रहा हूं, लेकिन सिर्फ nHibernate से शुरू कर रहा हूं। सादर –

+0

यह सिर्फ ऑब्जेक्ट है। आईडी या जो भी आपका आईडी फ़ील्ड कहलाता है। –

उत्तर

2

ठीक है, समस्या मेरे कोड में कहीं और थी। आप सहेजने के तुरंत बाद आईडी प्राप्त कर सकते हैं, भले ही आपने लेनदेन नहीं किया है या इसे फ्लश नहीं किया है।

उत्तर के लिए सभी को धन्यवाद, लेकिन दुर्भाग्यवश उनमें से कोई भी पूरी तरह से सही नहीं है।

0

शायद यह डेटाबेस में स्वत: जेनरेटेड के रूप में सेट नहीं है? जैसा कि मैटियास जैकब्सन ने कहा था, आईडी सत्र के बाद निर्धारित की जानी चाहिए।

0

चूंकि यह एक लेनदेन है NHHernate स्थगित परिवर्तन और इस प्रकार INSERT डेटाबेस में नहीं भेजा जाता है - और डेटाबेस द्वारा कोई आईडी उत्पन्न नहीं होती है। सत्र करें। फ्लश() - यह लेनदेन को रोक नहीं देगा लेकिन आपके परिवर्तन (आईएनएसईआरटी) को निष्पादित किया जाएगा। या असाइन आईडी का उपयोग करें। या हमेशा लेनदेन शुरू नहीं करते - इसे स्पष्ट रूप से करें (उदाहरण के लिए एस # आर्क आर्किटेक्चर [लेनदेन] विशेषता के साथ करता है)।

0

मुझे लगता है कि प्रत्येक सत्र के लिए लेनदेन शुरू करना एक बुरा विचार है। मैं सत्र-प्रति-अनुरोध का उपयोग कर रहा हूं और मैं सत्र_इंडरक्वेट में लेनदेन शुरू करता हूं और प्रतिबद्ध करता हूं। हालांकि, मेरे पास आमतौर पर पृष्ठ पर एक लेनदेन होता है ताकि मैं वहां होने वाली किसी भी त्रुटि को संभाल सकूं - जब तक EndRequest होता है तो कुछ भी करने में बहुत देर हो जाती है लेकिन एक सामान्य त्रुटि संदेश प्रस्तुत होता है।

यदि आप डेटाबेस जेनरेट (पहचान) आईडी का उपयोग कर रहे हैं तो आपको आईडी उत्पन्न करने के लिए सत्र को फ़्लश करना होगा।

+0

आपको प्रत्येक सत्र के लिए लेनदेन का उपयोग करना चाहिए, यहां तक ​​कि पढ़ता है। अन्यथा आप पूरी तरह से कैश का उपयोग नहीं करेंगे - देखें: http://ayende.com/Blog/archive/2008/12/28/nh-prof-alerts-use-of-implicit-transactions-is-discouraged.aspx – UpTheCreek

+0

मैं सहमत हूं, जब तक कि आप प्रति सत्र एक लेनदेन का मतलब नहीं लेते। मेरा जवाब स्पष्ट हो सकता था, लेकिन मैं लेनदेन के जीवनकाल को अनुरोध जीवनकाल के बराबर करने की अनुमति देने के खिलाफ बहस कर रहा था। प्रति सत्र एकाधिक लेनदेन करने में कोई समस्या नहीं है। –

7

एनएचबर्ननेट सत्र के दौरान एक आईडी उत्पन्न करता है। सेव() या सत्र.SaveOrUpdate() को एक क्षणिक इकाई के साथ बुलाया जाता है। इस समय, इकाई की आईडी संपत्ति सेट की गई है और इसका उपयोग किया जा सकता है।

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

    कुछ() NHibernate.ITransaction.Commit से खोजें() या Enumerable()
  • का आमंत्रण
  • से
  • :

    अन्यथा, डालने तक सत्र प्लावित है जो होगा लंबित है ISession.Flush()

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