मैं nHibernate के लिए नया हूं, और वेब एप्लिकेशन फॉर्म पोस्ट से अलग ऑब्जेक्ट्स को अपडेट करने के लिए उचित तरीके से अपना सिर प्राप्त करने का प्रयास कर रहा हूं। , (हम ASP.NET MVC का उपयोग कर रहे)एएसपीनेट पोस्ट एक्शन विधि से निबर्ननेट इकाई को अपडेट करने का सही तरीका क्या है?
वस्तु मैं अद्यतन करने के लिए (अन्य बातों के अलावा) शामिल हैं बच्चे वस्तुओं का एक IList कोशिश कर रहा हूँ कुछ इस तरह से मैप किया:
<bag name="PlannedSlices" inverse="true" cascade="all-delete-orphan">
<key column="JobNumber" />
<one-to-many class="SliceClass" />
</bag>
हम व्यवस्था की है हमारे MVC संपादित दृश्य प्रपत्र इसलिए जब यह वापस पोस्ट किया जाता है, हमारे कार्रवाई विधि बजे वस्तु पारित कर दिया है कि (सूची <> बच्चे मदों की incluing। हम राउंड ट्रिप सभी इकाई आईडी सही ढंग से फ़ॉर्म के माध्यम से।
हमारी अनुभवहीन पर प्रयास पोस्ट एक्शन विधि एक सत्र करता है .aveOrUpdate (parentObject), parentObject के साथ जिसे डिफ़ॉल्ट रूप से व्यू फ़ॉर्म से स्क्रैप किया गया है lbinder।
यह निम्न परिदृश्यों में से किसी के लिए ठीक काम करने के लिए लगता है:
- एक नया पैरेंट ऑब्जेक्ट
- नए बच्चे को बनाना, संशोधित माता पिता के गुण
- जोड़ना वस्तुओं
- में संशोधन मौजूदा बच्चे वस्तुओं (NHibernate लॉग को देखते हुए, मैं इसे सही ढंग से स्थापित कर सकता हूं यदि ऑब्जेक्ट्स नए हैं या मौजूदा हैं, और उचित अद्यतन या INSERT जारी कर रहे हैं)
जो परिदृश्य विफल रहता है वह है: - बाल वस्तुओं को हटाना - यानी यदि वे IList में नहीं हैं, तो वे डेटाबेस से हटा नहीं पाए जाते हैं। कोई अपवाद या कुछ भी नहीं है, वे सिर्फ हटाए नहीं जाते हैं।
मेरी समझ यह है कि ऐसा इसलिए है क्योंकि जादू जो nHibernate करता है वह बच्चों की एक सूची बनाने के लिए करता है जिसे हटाने की आवश्यकता होती है, अलग-अलग उदाहरणों के साथ काम नहीं करती है।
मैं इस प्रकार की एक्शन विधि को nHibernate (यानी एक मॉडल-बाइंडर ऑब्जेक्ट का उपयोग एक पृथक nHibernate उदाहरण के रूप में उपयोग करना) के बारे में एक साधारण उदाहरण नहीं ढूंढ पाया है - एमएस ईएफ (उदाहरण के लिए http://stephenwalther.com/blog/archive/2009/02/27/chapter-5-understanding-models.aspx) पर आधारित उदाहरण मॉडल-बाउंड ऑब्जेक्ट से बदले गए गुणों को दोबारा लोड किए गए इकाई उदाहरण में प्रतिलिपि बनाने के लिए 'ApplyPropertyChanges' विधि का उपयोग करने लगते हैं।
तो, इसके बाद, सवाल बहुत आसान है - अगर मेरे पास मॉडल बाइंडर है तो मुझे एक नई वस्तु दें जिसमें बाल वस्तुओं का संग्रह शामिल है, मुझे इसे nHibernate के माध्यम से कैसे अपडेट करना चाहिए, (जहां 'अपडेट' संभवतः हटाने में शामिल है बच्चों का)?
इसके लिए बहुत बहुत धन्यवाद - वहां बहुत सारे काम हैं! दुर्भाग्यवश, जिस बिट के साथ मैं संघर्ष कर रहा हूं वह यह है कि मेरे पास दूसरे सत्र/लेनदेन (यानी मेरा पोस्ट) में 'व्यक्ति' वस्तु है जो एक पूरी तरह से नई वस्तु है जिसे मॉडलबिंडर द्वारा एक पुनर्प्राप्त वस्तु के बजाय बनाया गया था, जिसमें एक है कुछ फ़ील्ड संशोधित हुए और इसमें कुछ 'डिलीट बच्चे' कॉल किए गए। मुझे लगता है कि मैं जो खोज रहा हूं वह उस नए ऑब्जेक्ट को लेने और पुनर्प्राप्त ऑब्जेक्ट में इसके परिवर्तन लागू करने का एक तरीका है, ताकि एनएच आवश्यक एसक्यूएल को काम कर सके। शायद यह अस्तित्व में नहीं है। –
जिस तरह से मैं उस स्थिति से निपटने का प्रयास करता हूं वह मॉडल प्रदाता द्वारा प्रस्तुत प्रस्तुति मॉडल ऑब्जेक्ट के रूप में बनाई गई नई वस्तु का इलाज कर रहा है। आपको अभी भी ऑब्जेक्ट को पुनर्प्राप्त करने की आवश्यकता होगी (या किसी भी तरह से "जारी" वर्ग का उदाहरण बनाएं) जिसे आप अपडेट करना चाहते हैं और उस ऑब्जेक्ट पर उन अपडेट को लागू करना चाहते हैं। फिर आप उस ऑब्जेक्ट को NHibernate में सहेज सकते हैं। क्या इसका कोई मतलब है? –
तो आप 'प्रस्तुति (यानी POST)' ऑब्जेक्ट के गुणों के साथ 'पुनर्प्राप्त' ऑब्जेक्ट के गुणों को ओवरराइट करते हैं, तो आप 'मैन्युअल' (यानी संपत्ति-दर-संपत्ति, लूप के साथ या बाल संग्रह के लिए जो भी) करेंगे, तो 'पुनर्प्राप्त' ऑब्जेक्ट के गुणों को ओवरराइट करेंगे? और मैन्युअल रूप से आवश्यक बाल हटावट की गणना? मैं उम्मीद कर रहा था की तुलना में थोड़ा और काम (और रखरखाव!) लगता है। मॉडल-बाइंडर के साथ परेशान करने के लिए मुश्किल से लगता है, वास्तव में, जैसे कि मुझे एक समय में फ़ील्ड को संभालना होगा, मैं उन्हें फॉर्म प्रतिक्रिया से सीधे खींच सकता हूं। फ़िर भी सहायता के लिए धन्यवाद। –