2009-08-06 13 views
20

हम this mapping कैसे और आसानी से करते हैं?धाराप्रवाह निबर्ननेट में तालिका में कैसे शामिल हों

<class name="Person" table="People"> 

    <id name="Id"> 
     <generator class="identity"/> 
    </id> 

    <property name="Name" /> 

    <join table="Addresses"> 
     <key column="PersonId"/> 
     <property name="Line1"/> 
     <property name="Line2"/> 
     <property name="City"/> 
     <property name="Country"/> 
     <property name="ZipCode"/> 
    </join> 

</class> 

मुझे पता है कि मैं 'संदर्भ' का उपयोग कर सकता हूं लेकिन मुझे संबंधित तालिका से सभी कॉलम की आवश्यकता नहीं है। मुझे बस एक संपत्ति की जरूरत है।

उत्तर

24

के साथ धाराप्रवाह मैपिंग्स को मिश्रण करना होगा क्या पैको ने कहा सही नहीं है। यह फ्लुएंट एनएचबेर्नेट में किया जा सकता है। मैंने अपने आप को थोड़ी देर में खोजा, किसी को भी इस विकल्प के बारे में बात नहीं कर सका, इसलिए मैंने अभी थोड़ा एफएनएचबर्ननेट के साथ खेला और अंततः इसे करने में कामयाब रहा।

यह मेरा परिदृश्य था:

मैं दो तालिकाओं है -

"FormFields" => Columns { "FieldId", "FieldName", "FieldType", "DisplayOrder" } 
"FormStructure" => Columns { "FormId", "FormType", "FieldId" } 

इन थे मेरी संस्थाओं:

public class FormStructure 
{ 
    public virtual Int32 FormId { get; private set; } 
    public virtual Int32 FormType { get; set; } 
    public virtual FormField FieldId { get; set; } 
} 

public class FormField 
{ 
    public virtual int FieldId { get; private set; } 
    public virtual String FieldName { get; set; } 
    public virtual int? FieldType { get; set; } 
    public virtual int? DisplayOrder { get; set; } 
} 

मैं अपने प्रश्न में तरीकों की एक जोड़ी है कि एक सूची प्रदान की है FormStructure वस्तुओं की। मैं इन विधियों को DisplayOrder फ़ील्ड द्वारा FormField ऑब्जेक्ट में आदेश देने के लिए आदेश देना चाहता था, और DisplayOrderFormStructure ऑब्जेक्ट में अन्य कारणों से भी संपत्ति के रूप में उपलब्ध होना चाहता था।

यह मूलतः इसका मतलब है मैं टेबल में शामिल होने के लिए इतना है कि मैं, FormField मेज से DisplayOrder स्तंभ के साथ FormStructure मेज से सभी स्तंभों को पुनः प्राप्त होगा मिलान FieldId स्तंभों पर उन्हें शामिल होने की जरूरत है।

क्या मैं इस को हल करने के लिए क्या किया:

  1. मैं अपने FormStructure वस्तु में कोई प्रॉपर्टी DisplayOrder कहा जाता है।

    public virtual int? DisplayOrder { get; set; } 
    
  2. मैं अपने FormStructure मानचित्रण वर्ग के लिए Join विधि जोड़ा तो यह इस तरह देखा।

    public class FormStructureMap : ClassMap<FormStructure> 
    { 
        public FormStructureMap() 
        { 
         Table("FormStructure"); 
    
         Id(x => x.Id); 
         Map(x => x.FormType); 
         References(x => x.Schedule).Column("ScheduleId"); 
         References(x => x.Field).Column("FieldId"); 
         Map(x => x.IsMandatory).Nullable(); 
    
         Join("FormFields", m => 
         { 
          m.Fetch.Join(); 
          m.KeyColumn("FieldId"); 
          m.Map(t => t.DisplayOrder).Nullable(); 
         }); 
        } 
    } 
    

Join विधि स्पष्ट रूप से आप के भीतर से जुड़ें KeyColumn विधि में निर्धारित स्तंभ पर दो तालिकाओं के बीच में शामिल हो जाएगा।

यह कुछ पंक्तियों को भी हटा देगा जिनमें शून्य मान हैं। इससे बचने के लिए (मैंने हाल ही में इसमें भाग लिया) आप विधि के अंदर m.Optional(); जोड़ सकते हैं।

मैं अब, FormStructure वस्तुओं की सूची प्राप्त कर सकता है DisplayOrder से उन्हें ऑर्डर और यहां तक ​​कि FormStructure वस्तु में एक संपत्ति के रूप में DisplayOrder उपलब्ध है।

return session.CreateCriteria<FormStructure>() 
       .Add(Expression.Eq("FieldName", fieldName)) 
       .AddOrder(Order.Asc("DisplayOrder")) 
       .List<FormStructure>(); 

यह पहले नहीं किया जा सकता था, क्योंकि यह आदेश खंड मैं वहाँ है में DisplayOrder स्तंभ मान्यता प्राप्त नहीं होता।

+0

दिलचस्प, हालांकि, Subclass मैपिंग के साथ जॉइन() विधि पर प्रलेखन में शामिल होने के लिए दूसरे क्रिया तर्क के लिए कहते हैं() -> "यह केवल तभी काम करता है जब आप तालिका-प्रति-विरासत पदानुक्रम रणनीति में हों। – PandaWood

0

जहां तक ​​मुझे पता है, यह फ्लुएंट एनएचबेर्नेट में समर्थित नहीं है, जैसे कई अन्य विरासत-डेटाबेस विशिष्ट मैपिंग्स। मुझे डर है कि आपको एचबीएम.एक्सएमएल पर वापस स्विच करना होगा या एचबीएम.एक्सएमएल

+0

मैं बस एक ही सटीक समस्या में भाग गया। मैंने पहले से ही अपनी सभी तालिकाओं को धीरे-धीरे मैप किया है, और लिंक में दिखाए गए अनुसार, मुझे शामिल होने में केवल एक कॉलम जोड़ना होगा। मैं एक्सएमएल मैपिंग में इस अतिरिक्त जोड़ के साथ अपने धाराप्रवाह मैपिंग को कैसे मिश्रित कर सकता हूं? – gillyb

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