2008-10-28 13 views
12

मेरे पास ओरेकल डेटाबेस है और फ़ील्ड में से एक दिनांक सीमा क्षेत्र है। यह मूल रूप से डेटाबेस में VARCHAR (40) के रूप में YYYY/MM/DD-YYYY/MM/DD प्रारूप में संग्रहीत है। मुझे लगता है मैं इसकस्टम प्रकारों के लिए nHibernate मैपिंग

public class DateTimeRange 
{ 
    public DateTimeRange(DateTime fromTime, DateTime toTime) 
    { 
     FromTime = fromTime; 
     ToTime = toTime; 
    } 

    public override string ToString() 
    { 
     return String.Format("{0} to {1}", FromTime.ToString("HH:mm:ss"), ToTime.ToString("HH:mm:ss")); 
    } 

    public DateTime FromTime { get; set; } 

    public DateTime ToTime { get; set; } 
} 

तरह निर्मित कस्टम वर्ग के लिए nHibernate में यह मैप करने के लिए मैं कैसे इस तरह कस्टम वर्गों के लिए मैप कर सकते हैं करना चाहते हैं?

उत्तर

17

आपको अपना खुद का IUserType लागू करने की आवश्यकता है।

विवरण के लिए यह blog post देखें। यदि ब्लॉग गायब हो जाता है तो मैं नीचे दिए गए प्रासंगिक अनुभाग को भी पेस्ट कर दूंगा।

एनएचबेर्नेट में, एक कस्टम मैपिंग प्रकार एक वर्ग है जो आईयूसर टाइप या आईसीओमोसाइटसाइट यूज़र टाइप इंटरफेस से प्राप्त होता है। इन इंटरफेस में कई विधियां हैं जिन्हें कार्यान्वित किया जाना चाहिए, लेकिन हमारे उद्देश्यों के लिए, हम उनमें से 2 पर ध्यान केंद्रित करने जा रहे हैं। निम्नलिखित को धयान मे रखते हुए।

public class TypeClassUserType : IUserType 
    { 


    object IUserType.NullSafeGet(IDataReader rs, 
     string[] names, 
    object owner) { 

    string name = NHibernateUtil.String.NullSafeGet(rs, 
    names[0]) as string; 

    TypeClassFactory factory = new TypeClassFactory(); 
    TypeClass typeobj = factory.GetTypeClass(name); 
    return typeobj; 
    } 

    void IUserType.NullSafeSet(IDbCommand cmd, 
    object value, 
    int index) { 

     string name = ((TypeClass)value).Name; 
    NHibernateUtil.String.NullSafeSet(cmd, name, index); 
    } 
    } 

इस वर्ग बनाया करने के बाद, मैं अब स्पष्ट रूप से ActualClass और TypeClass के बीच सहयोग ActualClass मानचित्रण पर एक साधारण संपत्ति के रूप में देख सकते हैं।

<property 
    name="Type" 
    column="TypeName" 
    type="Samples.NHibernate.DataAccess.TypeClassUserType, 
     Samples.NHibernate.DataAccess" /> 

NHibernate ActualType का एक उदाहरण सहेजने की प्रक्रिया में है, यह लोड और TypeClassUserType का एक नया उदाहरण बना सकते हैं और NullSafeSet विधि कॉल करेंगे। जैसा कि आप विधि निकाय से देख सकते हैं, मैं बस मैप किए गए प्रॉपर्टी (मान पैरामीटर के रूप में पास) से नाम निकाल रहा हूं और निकाले गए नाम को डेटाबेस में सेट करने के लिए पैरामीटर के मान के रूप में सेट कर रहा हूं। शुद्ध परिणाम यह है कि यद्यपि ActualClass की टाइप प्रॉपर्टी डोमेन मॉडल में TypeClass है, केवल TypeClass ऑब्जेक्ट की नाम संपत्ति डेटाबेस में संग्रहीत होती है। इसका उलटा भी सच है। जब NHibernate डेटाबेस से ActualType का एक उदाहरण लोड कर रहा है और मेरे कस्टम मैपिंग प्रकार की एक संपत्ति पाता है, तो यह मेरा कस्टम प्रकार लोड करता है और NullSafeGet विधि को कॉल करता है। जैसा कि आप देख सकते हैं, मेरी विधि लौटाए गए डेटा से नाम प्राप्त करती है, टाइपक्लास का सही उदाहरण प्राप्त करने के लिए मेरे फ्लाईवेट फैक्ट्री को कॉल करती है, और फिर वास्तव में उस इंस्टेंस को लौटाती है। प्रकार की रिज़ॉल्यूशन प्रक्रिया पारदर्शी रूप से मेरे डेटा एक्सेस क्लास (और यहां तक ​​कि उस मामले के लिए NHibernate को भी) होती है।

+0

हाय TheSoftwareJedi, क्या आप पोस्ट में उल्लिखित लिंक की जांच करने में मदद कर सकते हैं? यह नहीं मिला है। क्या आप इसके बारे में एक उपलब्ध लिंक दे सकते हैं। धन्यवाद। –

+0

मैंने उत्तर से लिंक हटा दिया। मेरे पास एक और लिंक नहीं है, और यहां तक ​​कि लिंक ब्रेकिंग की भी उम्मीद है क्योंकि मैंने उत्तर के मुख्य भाग में प्रासंगिक अनुभाग रखा है। – TheSoftwareJedi

+0

https://web.archive.org/web/20100516024604/http://blogs.msdn.com/howard_dierking/archive/2007/04/23/nhibernate-custom-mapping-types.aspx –

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