2011-05-24 3 views
9

हमारे आवेदन कहानियां की अवधारणा और की टैग अवधारणा है। एक कहानी में कई टैग लागू हो सकते हैं, और कई कहानियों पर एक टैग लागू किया जा सकता है, जिससे रिश्तों को कई से अधिक बना दिया जा सकता है। दो तालिकाओं, कहानियां और टैग एक तिहाई, StoriesToTags द्वारा बांधा जाता है।NHibernate 3.x बच्चे संस्थाओं को हटा देता है जब संयोजन LINQ पेजिंग, कई-से-अनेक, और लाने सबसिलेक्ट

<class name="Story" table="Stories"> 
    ... 
    <set fetch="subselect" name="Tags" table="StoriesToTags"> 
    <key> 
     <column name="StoryId" /> 
    </key> 
    <many-to-many class="Tag"> 
     <column name="TagId" /> 
    </many-to-many> 
    </set> 
</class> 

और स्टोरी को टैग से व्युत्क्रम संबंध:

यहाँ स्टोरीको टैग से मानचित्रण है:

मानचित्रण फ़ाइलों के प्रासंगिक टुकड़े इस प्रकार हैं :

<class name="Tag" table="Tags"> 
    ... 
    <set fetch="subselect" inverse="true" name="Stories" table="StoriesToTags"> 
    <key> 
     <column name="TagId" /> 
    </key> 
    <many-to-many class="Story"> 
     <column name="StoryId" /> 
    </many-to-many> 
    </set> 
</class> 

जैसा कि आप देख सकते हैं, हम उप-चयन एन + 1 क्वेरी समस्या से बचने के लिए fetch रणनीति का उपयोग कर रहे हैं। सब कुछ अच्छा काम करता है, जब तक आप पृष्ठ के लिए एक परिणाम LINQ का उपयोग कर प्रयास:

IQueryable<Story> stories = GetStories(...).TakePage(pageNumber, pageSize); 

इस क्वेरी चलाने के बाद, NHibernate सभी कहानियों कि क्वेरी में लोड नहीं कर रहे थे के लिए रिश्तों (StoriesToTags में रिकॉर्ड) को हटाता है। ऐसा लगता है जब टैग विशेष रूप से लोड होते हैं (यानी, उप-चयन ट्रिगर किया जाता है)। या फ़ेच रणनीति का चयन करें, लेकिन इससे एन + 1 प्रश्न निष्पादित किए जाने का कारण बनता है, तो रिश्तों को हटाया नहीं जाता है।

मेरे सर्वोत्तम अनुमान NHibernate सोचता है कि टैग अनाथ कर दिया है, लेकिन हम संग्रह पर कोई cascades निर्धारित नहीं की है। साथ ही, जहां तक ​​मैं कह सकता हूं, एक कैस्केड स्थापित करने का कोई प्रभाव नहीं पड़ता है।

यह प्रक्रिया NHibernate 2.x और NHibernate.Linq के तहत बहुत अच्छी तरह से काम करती है। हमने हटाए जाने के साथ इस मुद्दे को तब तक नहीं देखा जब तक हम NHibernate 3.x में स्थानांतरित नहीं हुए, जिसमें LINQ समर्थन अंतर्निहित है। मुझे यकीन नहीं है कि इससे कोई फर्क पड़ता है, लेकिन इसके लायक होने के लिए, हम पहचान कुंजी के साथ SQL सर्वर का उपयोग कर रहे हैं।

कोई विचार? मैंने शुरू में सोचा था कि मैं कुछ बेवकूफ बेवकूफ कर रहा था, लेकिन मैंने मूल रूप से मैपिंग के हर क्रमपरिवर्तन की कोशिश की है और हम इस मुद्दे को खत्म नहीं कर सकते हैं।

संपादित करें: जानकारी के एक और दिलचस्प टुकड़ा। यदि आप सत्र बंद करने से पहले session.IsDirty() पर कॉल करते हैं, तो समस्या नहीं होती है। मुझे संदेह है कि ऐसा इसलिए है क्योंकि फ्लश के बीच संग्रह परिवर्तन जारी नहीं हैं, लेकिन मैं निश्चित रूप से जानने के लिए पर्याप्त रूप से एनएचबीर्नेट के स्रोत को समझ नहीं सकता।

+0

आप कहानियों और टैग संपत्तियों के लिए गेटर पोस्ट कर सकते हैं? –

+0

@ जकूब - गेटर्स केवल ऑटो-गुण हैं, प्रकार 'आईसीओलेक्शन ' टाइप करें। –

उत्तर

0

आप हमें आप यहाँ क्या हासिल करने की कोशिश कर रहे हैं पर कुछ सुराग दे सकते हैं? मैं एक निर्दिष्ट के साथ कभी नहीं प्रयोग पर लाने के लिए एक बहुत-से-अनेक है, लेकिन मेरे कई लोगों के लिए यह सब स्पष्ट झरना के कुछ प्रकार के साथ कुछ मिल गया सोचता = एक कई के लिए। Cascade.None() इस इकाई को छोड़कर कुछ और को हटाने रुक जाएगा:

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