2010-07-06 9 views
10

मेरे पास दो वर्ग हैं:NHibernate: "संग्रह आलसी लोडिंग मुद्दे के कारण फ्लश() द्वारा संसाधित नहीं किया गया था

class Parent 
{ 
    public virtual Child Child { get; set; } 
} 

class Child 
{ 
    public virtual IList<GrandChild> GrandChildren { get; set; } 
} 

मेरे ISession से लोड Parent का एक उदाहरण है, Parent.Child आलसी लोड है (इस बिंदु पर लोड नहीं किया गया है)। चाइल्ड.ग्रांड चिल्ड्रेन भी आलसी भरा हुआ है।

अगर मैं ऐसा करता हूं:

session.Save(new Parent { Child = existingParent.Child }); 

मुझे collection [Child.GrandChildren] was not processed by flush()

मिलता है यदि मैं existingParent की Child प्रॉपर्टी को लोड करने का कारण बनता हूं, बस इसे एक्सेस करके:

var x = existingParent.Child.Name 

समस्या जाता है दूर। यह क्यों हो रहा है, और मैं इसे कैसे हल करूं - अधिमानतः मेरी fetching रणनीति को बदलने के बिना?

** संपादित करें: ** अभिभावक के पास बाल

के लिए एक एफके है I NH 2.1.2.4000

का उपयोग कर रहा हूँ धन्यवाद

+0

क्या आपको कोई ऐसा फ़िक्स मिला जो संग्रह को छूने में शामिल नहीं है? – bcsanches

+0

ऐसा न सोचें :( –

+0

जब तक कि "दस्तावेज़ डीबी का उपयोग न करें, इसके बजाय" –

उत्तर

0

बाल से पोते के लिए व्यापक परिवर्तन के लिए झरना सेटिंग क्या है संग्रह? मुझे लगता है कि अगर संग्रह गंदा है तो NHibernate इस अपवाद को फेंकता है लेकिन कैस्केड सेटिंग में परिवर्तनों को जारी नहीं किया जाता है।

+0

ive ने कोई बदलाव नहीं किया है, इसलिए इसका लोड क्यों नहीं किया गया? मैं सिर्फ एक नया 'माता-पिता' बनाना चाहता हूं, उसी बच्चे के साथ मौजूदा 'पैरेंट' के रूप में। हैसोन के लिए कैस्केड ' saveupdate' और हैसमनी के लिए 'alldeleteorphan' –

+0

क्या आप चाइल्ड के कन्स्ट्रक्टर में ग्रांड चाइल्डर संग्रह शुरू कर रहे हैं? कृपया मैपिंग दिखाएं। –

0

आप session.Load का उपयोग Child के मौजूदा उदाहरण को डीबी के लिए यात्रा किए बिना संदर्भित करने के लिए कर सकते हैं। यह यह करना चाहिए, मुझे लगता है कि:

session.Save(new Parent { Child = session.Load(existingParent.Child.Id) }); 

लेकिन यह सुनिश्चित करें कि .Id कॉल एक डाटाबेस यात्रा ट्रिगर नहीं करता करने के लिए जाँच।

1

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

मुझे जो अपवाद मिला वह था: कक्षा नाम: त्रुटि | NHibernate.AssertionFailure: संग्रह [संग्रहनाम] फ्लश द्वारा संसाधित नहीं किया गया था()

मैं अभी भी यह प्रारंभ करना चाहता हूं, लेकिन मुझे लगता है कि मुझे उस समस्या का कुछ अन्य समाधान मिलना है।

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