2010-03-05 10 views
6
हटाना

परिदृश्य इस प्रकार है के रूप में झरना नहीं हैnhibernate, बच्चों

मैं 3 वस्तुओं है (मैं नाम सरलीकृत), जनक नामित माता पिता के बच्चे & बच्चे के बच्चे
माता पिता के बच्चे माता-पिता में एक सेट है, और बच्चे का बच्चा बच्चे में एक सेट है।

मानचित्रण के रूप में (प्रासंगिक भागों)

माता पिता का अनुसरण करता है

<set name="parentset" 
    table="pc-table" 
    lazy="false" 
    fetch="subselect" 
    cascade="all-delete-orphan" 
    inverse="true"> 
    <key column=FK_ID_PC" on-delete="cascade"/> 
    <one-to-many class="parentchild,parentchild-ns"/> 
</set> 

माता पिता के बच्चे

<set name="childset" 
    table="cc-table" 
    lazy="false" 
    fetch="subselect" 
    cascade="all-delete-orphan" 
    inverse="true"> 
    <key column="FK_ID_CC" on-delete="cascade"/> 
    <one-to-many class="childschild,childschild-ns"/> 
</set> 

क्या मैं हासिल करना चाहते हैं जब मैं माता-पिता को हटाते हैं, वहाँ एक हो सकता है कि कैस्केड बच्चे के बच्चे को हर तरह से हटा दें। लेकिन वर्तमान में यह क्या होता है।

(यह विशुद्ध रूप से मानचित्रण परीक्षण उद्देश्यों के लिए है) एक मूल इकाई रही (ठीक काम करता है)

IQuery query = session.CreateQuery("from Parent where ID =" + ID); 
IParent doc = query.UniqueResult<Parent>(); 
अब

हटाने हिस्सा

session.Delete(doc); 
transaction.Commit(); 

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

क्या मुझे अपनी मैपिंग में कुछ याद आया, जिसे याद किया जा सकता है? सही दिशा में कोई संकेत स्वागत से अधिक है!


डिएगो, बिंदु के उत्तर के लिए धन्यवाद। (और व्याख्या)

मैं on-delete="cascade" को दूर करने के साथ चला गया, इस वजह से मैं डेटाबेस में कोड में और नहीं जितना संभव हो उतना नियंत्रण की तरह।

नीचे पोस्ट किया गया कोड (कामकाजी) परिणाम है।

माता पिता

<set name="parentset"  
    table="pc-table"  
    cascade="all-delete-orphan"  
    inverse="true" 
    batch-size="5">  
    <key column=FK_ID_PC"/>  
    <one-to-many class="parentchild,parentchild-ns"/>  
</set> 

माता पिता के बच्चे

<set name="childset"    
    table="cc-table"  
    cascade="all-delete-orphan" 
    batch-size="5" 
    inverse="true">    
    <key column="FK_ID_CC">    
    <one-to-many class="childschild,childschild-ns"/>    
</set> 

आशा इस एक ही समस्या के साथ लोगों को मदद करता है!

उत्तर

6

कुंजी पर on-delete="cascade" सेट करके, आप डीबी को कैस्केडिंग को संभालने दे रहे हैं।

क्या आप अपनी स्कीमा एनएचबीर्नेट के साथ उत्पन्न कर रहे हैं?

मैंने अभी आपके उदाहरण को पुन: उत्पन्न किया है और यह उस विशेषता के साथ और बिना ठीक काम करता है। इसे हटाते समय, NHibernate कैस्केडिंग करता है।

बीटीडब्ल्यू, lazy="false" fetch="subselect" का उपयोग करके कुछ ऐसा नहीं है जो आपको डिफ़ॉल्ट रूप से करना चाहिए। यदि आप उन विशेषताओं को हटाते हैं, तो on-delete="cascade" छोड़ें और cascade से save-update पर जाएं, आपके पास केवल माता-पिता को पुनर्प्राप्त करने और हटाने के लिए दो प्रश्न होंगे।