2010-12-10 5 views
6

मैं एक्स जो प्रकार का ऑब्जेक्ट objectX जो एक संपत्ति ListOfObjectYs है thats एकnhibernate में, अद्यतन बच्चे की सूची के लिए सक्षम नहीं वस्तुओं

List<objectY> 

nhibernate मानचित्रण इस तरह दिखता है:

public ObjectXMap() 
    { 
     HasMany(x => x.ListOfObjectYs).AsBag().Inverse(); 
    } 

जब मैं इसे सहेजने के लिए जाना है, मैं objectX और उसके बाद है पर कुछ गुणों को बदलने :

Session.SaveOrUpdate(x); 

अब मुझे इस संपत्ति को अद्यतन करने की आवश्यकता है जो एक सूची है। मुझे ऑब्जेक्ट की एक नई सूची मिलती है और मैं ऑब्जेक्ट की मौजूदा सूची को एक नई सूची से बदलना चाहता हूं। क्या मुझे ऐसा करने की ज़रूरत है?

foreach (ObjectY y in x.ListOfObjectYs) 
       { 
        Session.Delete(y); 
        deleted = true; 
       } 
       if (deleted) 
       { 
        _session.Flush(); 
       } 
       x.ListOfObjectYs.Clear(); 

       foreach (ObjectY y in newObjectYList) 
       { 
        x.ListOfObjectYs.Add(y); 
        Session.SaveOrUpdate(y); 
       } 
       _session.Flush(); 

मेरे प्रश्न हैं:

  1. मैं नए लोगों को जोड़ने से पहले सब कुछ और फ्लश नष्ट करने के लिए है।
  2. मैं इन वृद्धिशील के सभी में
  3. के बीच

वहाँ इस अद्यतन करने का एक बेहतर तरीका है जहां मैं एक वस्तु (गुण) अद्यतन करने के लिए, लेकिन यह भी अद्यतन गुण है कि सूची में हैं जहां जरूरत है बचाता है करने के लिए की जरूरत है एक पूरी नई सूची (जिसका अर्थ है कि वस्तुओं को हटाया जाना चाहिए और जोड़ा जाना चाहिए)।

उत्तर

3

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

यह समझना महत्वपूर्ण है कि क्या बचाओ, अद्यतन, और SaveOrUpdate NHibernate में मतलब महत्वपूर्ण है:

  • सहेजें - या बचाएँ - एक बदली हुई अलग वस्तु लगातार
  • SaveOrUpdate बनाने - एक नया वस्तु लगातार
  • अद्यतन बनाना ऑब्जेक्ट के पहचानकर्ता के unsaved-value के आधार पर अद्यतन

Manipulating Persistent Data भी देखें।

यह मानते हुए कि अपने सभी वस्तुओं एक ही सत्र में लोड किया गया तो एक संग्रह की जगह के रूप में आसान के रूप में हो सकता है:

x.ListOfObjectYs.Clear(); 
foreach (ObjectY y in newObjectYList) 
{ 
    x.ListOfObjectYs.Add(y); 
} 
_session.Flush(); 
+0

वास्तव में वाई ऑब्जेक्ट्स को सहेजे बिना आप इसे कैसे कर सकते हैं। तुम्हारा मुद्दा है, कि कैस्केड। AllDeleteOrphan() उस पर ख्याल रखता है ?? – leora

+0

मुझे अब एक त्रुटि मिल रही है: कैस्केड = "ऑल-डिलीट-अनाथ" के साथ एक संग्रह अब मालिक इकाई इकाई द्वारा संदर्भित नहीं किया गया था: ऑब्जेक्ट – leora

+3

यदि वाई ऑब्जेक्ट्स नए हैं तो आपको उन्हें लगातार बनाए रखने के लिए पहले उन्हें सहेजना होगा। त्रुटि संदेश इंगित कर सकता है कि आप संग्रह संदर्भ को फिर से असाइन कर रहे हैं, http://www.sleberknight.com/blog/sleberkn/entry/20070329 और http://stackoverflow.com/questions/2127016/nhibernate- मानचित्रण देखें -एक-संग्रह-साथ-cascadeall हटाना-अनाथ-था-न अब-r। –

3

आपको अपने HasMany() पर एक कैस्केड चाहिए। यदि बच्चे की वस्तुएं पूरी तरह से माता-पिता के स्वामित्व में हैं, तो कैस्केड.एल्डेलेटेऑर्फन() एक अच्छी पसंद है। इस तरह माता-पिता पर सहेजे, अद्यतन और हटाए जाते हैं, स्वचालित रूप से बाल वस्तुओं को कैस्केड कर दिया जाता है, जो आपके जटिल foreach ब्लॉक की आवश्यकता को हटा देता है। इस जगह के साथ, बस अपने संग्रह को अद्यतन करें और अपना लेनदेन करें। NHibernate बाकी का ख्याल रखेगा।

अद्यतन: सूची को संशोधित करने के लिए, सूची में आइटम को केवल जोड़ें और हटाएं जैसा कि आप आमतौर पर .NET संग्रह के साथ करेंगे। उदाहरण के लिए:

public void RemoveY(ObjectY someY) { 
    ListOfObjectYs.Remove(someY); 
} 

public void AddY(ObjectY someY) { 
    ListOfObjectYs.Add(someY); 
} 

public void ClearAllY() { 
    ListOfObjectYs.Clear(); 
} 

जब लेनदेन के लिए प्रतिबद्ध है, ListOfObjectYs संग्रह में कोई भी परिवर्तन माता पिता ObjectX के साथ कायम हो जाएगा।

+0

स्पष्ट होना, मैं अपने मैपिंग फ़ाइल को Cascade.AllDeleteOrphan() जोड़ें। बस पर्याप्त है। क्या आप सूची के अपडेट को करने के लिए सिंटैक्स प्रदान कर सकते हैं क्योंकि मेरा मतलब यह नहीं है कि मैं आपका क्या मतलब हूं, "मैं केवल प्रत्येक के लिए हटा सकता हूं", किसी बिंदु पर मुझे मौजूदा प्रविष्टियों को हटाना होगा और नए जोड़ना होगा। मैं नहीं देखता कि मैं इससे कैसे बाहर निकलता हूं। – leora

+0

- मुझे अब एक त्रुटि मिल रही है: कैस्केड = "ऑल-डिलीट-अनाथ" के साथ एक संग्रह अब मालिक इकाई उदाहरण द्वारा संदर्भित नहीं किया गया था: ऑब्जेक्ट – leora

+0

क्या आप एक संग्रह को दूसरे में असाइन कर रहे हैं? जैसे x1.ListOfYs = x2.ListOfYs? आपको संग्रहों के बीच वस्तुओं की प्रतिलिपि बनाना चाहिए, संग्रहों के संदर्भों को डुप्लिकेट नहीं करना चाहिए। यदि ऐसा नहीं है, तो आपको प्रासंगिक कोड प्रदान करना होगा। –

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