8

मेरे पास निम्न वर्ग द्वारा प्रतिनिधित्व किया गया एक फ़ोल्डर पदानुक्रम है:एक आत्म-संदर्भ फ़ोल्डर पदानुक्रम को मैप करने के लिए मैं फ़्लुएंट एनएचबेर्नेट का उपयोग कैसे करूं?

public class Folder 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual Folder ParentFolder { get; set; } 
    public virtual ICollection<Folder> SubFolders { get; set; } 
} 

दूसरे शब्दों में, प्रत्येक FolderParentFolder से संबंधित हो सकता है, साथ ही इसमें SubFolders भी है। मैं Fluent NHibernate के Automapper का उपयोग कर रहा हूं और स्वचालित रूप से SchemaExport का उपयोग कर डेटाबेस स्कीमा उत्पन्न कर रहा हूं। जब मैं कुछ टेस्ट फ़ोल्डरों को सहेजने का प्रयास करता हूं तो मुझे निम्न तालिका मिलती है:

Id | Name      | ParentFolder_id | Folder_id 
---------------------------------------------------------------- 
1 | Root Folder (has children) | NULL   | NULL 
2 | Root Folder (no children) | NULL   | NULL 
3 | Sub Folder     | 1    | NULL 
4 | Sub Sub Folder    | 2    | NULL 

अब तक इतना अच्छा है, ParentFolder_id कॉलम सही ढंग से सेट किया जा रहा है, हालांकि मुझे नहीं पता कि यह एक और Folder_id कॉलम क्यों बनाया गया है। अब, जब मैं निम्न कोड को चलाने का प्रयास करता हूं:

using (var session = SessionFactory.OpenSession()) 
{ 
    // I'm using NHibernate 3 
    var rootFolder = session.Query<Folder>() 
          .Where(x => x.Name.StartsWith("root").First(); 

    Console.WriteLine(rootFolder.SubFolders.Count()); 
} 

लौटाई गई गिनती 0 है, और निम्न SQL निष्पादित है:

SELECT count(Id) FROM [Folder] WHERE Folder_id = 1 

यह SQL कथन गलत है। यह करना चाहिए:

SELECT count(Id) FROM [Folder] WHERE ParentFolder_id = 1 

क्या कोई मुझे बता सकता है कि Fluent NHibernate अतिरिक्त Folder_id कॉलम क्यों बना रहा है और उस पर पूछताछ कर रहा है, और मैं इसे कैसे ठीक कर सकता हूं ताकि यह ठीक से ParentFolder_id कॉलम से पूछताछ कर सके? मैंने कोई भाग्य के साथ निम्नलिखित ओवरराइड की कोशिश की है:

public class FolderOverride : IAutoMappingOverride<Folder> 
{ 
    public void Override(AutoMapping<Folder> mapping) 
    { 
     mapping.HasMany(x => x.SubFolders).Inverse(); // I thought inverse might fix it, but no dice 
     mapping.References(x => x.ParentFolder); 
    } 
} 
+0

धाराप्रवाह-एनएच का कौन सा संस्करण आप चल रहे हैं? जहां तक ​​मैं कह सकता हूं, इसे संस्करण 1.1 के रूप में बॉक्स से बाहर समर्थित किया जाना चाहिए: http://fluentnhibernate.lighthouseapp.com/projects/33236/tickets/115-self-referencing-relationships –

+0

मैं सिर का उपयोग कर रहा हूं कुछ दिनों पहले ट्रंक का। –

उत्तर

8

मुझे लगता है कि आपको अपने मैपिंग ओवरराइड पर कॉलम निर्दिष्ट करना होगा।

mapping.HasMany(x => x.SubFolders).KeyColumn("ParentFolder_id"); 
+0

धन्यवाद, यह किया। मुझे बस रिश्ते के दोनों पक्ष एक ही कॉलम का उपयोग कर रहे थे: 'मैपिंग। हैसमेन (x => x.SubFolders)। केकॉलम ("पेरेंटफोल्डर_आईडी");' और 'मैपिंग। संदर्भ (x => x.ParentFolder) .Column ("ParentFolder_id"); '। –

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

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