2009-08-24 11 views
6

मेरे पास एक आत्म-संदर्भ कक्षा है। एक बच्चे के माता-पिता का संदर्भ होता है और माता-पिता के पास बच्चों की एक सूची होती है। चूंकि बच्चों की सूची का आदेश दिया गया है, इसलिए मैं एनएचबीर्नेट के उपयोग से संबंधों को मैप करने की कोशिश कर रहा हूं।निबर्ननेट - मानचित्रण सूची अद्यतन नहीं है सूची सूचकांक

यह मेरा मानचित्रण है:

<class name="MyClass"> 
    <id name="Id"> 
    <generator class="native"/> 
    </id> 
    <list name="Children" cascade="delete" inverse="true"> 
    <key column="ParentId"/> 
    <index column="ListOrder"/> 
    <one-to-many class="MyClass"/> 
    </list> 
    <many-to-one name="Parent" class="MyClass" column="ParentId"/> 
</class> 

समस्या मैं आ रही है जब < एक द्वि-दिशात्मक मानचित्रण बच्चा होने -> माता पिता, सूची सूचकांक (ListOrder) डेटाबेस जब में अपडेट नहीं होता मैं अपना सीआरयूडी नृत्य करता हूं। इसका मतलब है कि जब मैं उदा। एक बच्चे को हटा दें, मुझे डेटाबेस में सहेजने और फिर माता-पिता को लाने के बाद बच्चों की सूची में छेद मिलता है। यदि मैं बिडरेक्शनलिटी को हटा देता हूं, तो बच्चों से माता-पिता (और कोई उलटा = सत्य) तक कई से नहीं होने पर, ListOrder को सही तरीके से अपडेट किया जाता है।

क्या आप में से कोई भी इससे पहले देखा है? क्या कोई आसान समाधान है?

+0

इसकी वजह से उलटा के = सच है, यकीन नहीं क्या सबसे अच्छा समाधान अभी तक नहीं है, इस समय बिल्कुल एक ही समस्या हो रही। –

+0

यूप ट्यूनेड रहें, यह उलटा = सत्य की वजह से है। यदि बिडिर हटा दिया जाता है, तो सबकुछ काम करता है जैसे मैं इसे करना चाहता हूं, ListOrder-wise। बात यह है कि मुझे खुद को बच्चों की संपत्ति को लागू करना है, जिसे मैं नहीं चाहता हूं। –

उत्तर

5

हां, यह उलटा = सत्य की वजह से है, वैकल्पिक समाधान ऑर्डर = "लिस्टऑर्डर" के साथ सूची के बजाय सेट या बैग का उपयोग करना होगा, सूची ऑर्डर क्लास को एक खाली सेटटर के साथ MyClass क्लास में एक संपत्ति के रूप में जोड़ें और एक गेटटर जो हमेशा अपने माता-पिता के बच्चे के संग्रह से इसकी अनुक्रमणिका देता है। इस तरह:

<class name="MyClass"> 
    <id name="Id"> 
     <generator class="native"/> 
    </id> 
    <bag name="Children" cascade="delete" inverse="true" order-by="ListOrder"> 
     <key column="ParentId"/> 
     <one-to-many class="MyClass"/> 
    </bag> 
    <property name="ListOrder" column="ListOrder"/> 
    <many-to-one name="Parent" class="MyClass" column="ParentId"/> 
</class> 

और वर्ग

public class MyClass 
{ 
    public virtual int ID { get; set; } 
    public virtual IList<MyClass> Children { get; set; } 
    public virtual MyClass Parent { get; set; } 

    public virtual int ListOrder 
    { 
     get 
     { 
      if (Parent == null || !Parent.Children.Contains(this)) return -1; 
      return Parent.Children.IndexOf(this); 
     } 
     set { } 
    } 
} 
+3

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

+0

मुझे संपत्ति विचार पसंद है –