2009-10-01 8 views
9

हमारे आवेदन में डेटा एक्सेस लेयर ओरेकल की यूडीटी कार्यक्षमता का उपयोग करने जा रहा है। हम केवल डेटाबेस से और यूडीटी वस्तुओं को पारित करेंगे।OracleObjectMappingAttribute का उपयोग किये बिना ओडीपी.NET के साथ ओरेकल यूडीटी से मैप कैसे मैप करूं?

फिलहाल, हम ODP.NET के साथ प्रदान किए गए फ़ंक्शन का उपयोग करके कस्टम कक्षाएं उत्पन्न करते हैं (जो वास्तव में एक भयानक दिखने वाली कक्षा बनाता है जिसे हम वास्तव में हमारे कोडबेस में नहीं चाहते हैं)।

हम कस्टम क्लास को हमारे व्यावसायिक ऑब्जेक्ट्स (और सहेजते समय वापस) में कस्टम क्लास को मैप करने के लिए एक अलग मैपिंग क्लास का उपयोग करते हैं।

मैं ऐसा करने का एक बेहतर तरीका खोजने की कोशिश कर रहा हूं।

मैंने सोचा कि मैं केवल जेनरेट किए गए वर्गों से दूर रहूंगा और केवल मैपिंग क्लास लिखूंगा जो IOracleCustomType को लागू करता है। तब से/toCustomObject विधियों को मेरे यूडीटी से मेरी व्यावसायिक वस्तुओं में मैप किया जाएगा। हालांकि, जब मैंने कोशिश की तो मुझे समस्याएं आईं - मुझे त्रुटि मिली "ऑब्जेक्ट विशेषता को कस्टम प्रकार के सदस्य के लिए मैप नहीं किया गया है"। ऐसा लगता है कि साथ ही साथ दो तरीकों से, मुझे अपने मैपिंग क्लास में विशेषताओं की भी आवश्यकता है - यूडीटी में प्रत्येक आइटम के लिए एक विशेषता।

उदाहरण के लिए - वर्कफ़्लो यूडीटी में तीन आइटम होते हैं - एक स्थिति, निर्मित समय और द्वारा निर्मित। मेरे UDT अच्छा और सरल है:

TYPE workflow_type AS OBJECT 
(status         VARCHAR2(8) 
,created_by        VARCHAR2(30) 
,created_datetime   DATE 
); 

व्यापार वस्तु मैं इसे में समाप्त करना चाहते हैं के रूप में:

public class Workflow 
{ 
    /// <summary> 
    /// Gets the status of the workflow. 
    /// </summary> 
    /// <value>The status.</value> 
    public string Status { get; private set; } 

    /// <summary> 
    /// Gets the Windows Logon Id of the user performing the action 
    /// </summary> 
    public string CreatedBy{ get; private set; } 
    /// <summary> 
    /// Gets the time of the action 
    /// </summary> 
    public DateTime CreatedTime { get; private set; } 
} 

मैं Oracle कोड जोड़े बिना दूसरे के लिए एक से प्राप्त करना चाहते हैं व्यापार वस्तु के लिए।

तो मेरे विचार इस तरह एक मानचित्रण वर्ग बनाने के लिए किया गया था:

public class WorkFlowMapper : IOracleCustomType 
{ 
    public BusinessObjects.WorkFlow BusinessObject {get; private set;} 

    public WorkFlowMapper(BusinessObjects.WorkFlow businessObject) 
    { 
     BusinessObject = businessObject; 
    } 

    public WorkFlowMapper(){} 

    public void FromCustomObject(OracleConnection con, IntPtr pUdt) 
    { 
     OracleUdt.SetValue(con, pUdt, "STATUS", BusinessObject.Status); 
     OracleUdt.SetValue(con, pUdt, "CREATED_BY", BusinessObject.CreatedBy); 
     OracleUdt.SetValue(con, pUdt, "CREATED_DATETIME", BusinessObject.CreatedTime); 
    } 

    public void ToCustomObject(OracleConnection con, IntPtr pUdt) 
    { 

     BusinessObject = new BusinessObjects.WorkFlow(
      (string)OracleUdt.GetValue(con, pUdt, "STATUS"), 
      (string)OracleUdt.GetValue(con, pUdt, "CREATED_BY"), 
      (string)OracleUdt.GetValue(con, pUdt, "CREATED_DATETIME") 
     ); 
    } 
} 

// Factory to create an object for the above class 
[OracleCustomTypeMappingAttribute("MYUSER.WORKFLOW_TYPE")] 
public class CurrencyExposureFactory : IOracleCustomTypeFactory 
{ 

    public virtual IOracleCustomType CreateObject() 
    { 
     WorkFlowMapper obj = new WorkFlowMapper(); 
     return obj; 
    } 
} 

लेकिन यह (प्रत्येक विशेषता के लिए OracleObjectMappingAttribute की आवश्यकता होगी, की आवश्यकता के लिए धन्यवाद काम नहीं करता है उत्पन्न ODP.NET में के रूप में मैप किया वर्ग)। यह वास्तव में बेवकूफ प्रतीत होता है क्योंकि मैं उनका उपयोग नहीं करूँगा। वास्तव में, मैं काम कर सकते हैं पाने के लिए मेरी मानचित्रण वर्ग के लिए, बस जोड़कर तीन लाइनों में:

[OracleObjectMappingAttribute("STATUS")] public string a; 
    [OracleObjectMappingAttribute("CREATED_BY")] public string b; 
    [OracleObjectMappingAttribute("CREATED_DATETIME")] public DateTime c; 

निश्चित रूप से इस तरह के एक भयानक हैक में डालने की तुलना में एक बेहतर तरीका होना चाहिए? आखिरकार, इन चरों का कभी भी उपयोग नहीं किया जाता है - ODP.NET को टाइप करने के लिए उन्हें टाइप करने की आवश्यकता होती है - लेकिन मैंने सोचा होगा कि यह एक अलग तरीके से हासिल किया जा सकता है। विचार?

उत्तर

2

उन अतिरिक्त विशेषताओं के बारे में इतना बुरा क्या है? .NET कक्षाओं और ढांचे में उदाहरण के लिए पहले से ही बहुत अधिक गुण हैं (उदाहरण के लिए डब्ल्यूसीएफ)। नापसंद गुण लगभग .NET को नापसंद करने जैसा ही है।

वैसे भी आप देवर्ट के ओरेकल प्रदाता (http://www.devart.com/dotconnect/oracle/) की संभावनाओं का पता लगा सकते हैं। उनके पास एक मुफ्त संस्करण भी है। Udts के साथ इसका व्यवहार तारों पर आधारित है विशेषताओं पर नहीं।

+4

क्या बुरा है कि उन्हें इसकी आवश्यकता नहीं होनी चाहिए। संपत्तियों को कभी भी प्राप्त नहीं किया जाता है या सेट नहीं किया जाता है, एकमात्र कारण की आवश्यकता होती है क्योंकि प्रत्येक यूडीटी संपत्ति को उन OracleObjectMappingAttribute में से एक की आवश्यकता होती है। ऐसा लगता है कि किसी वर्ग में सार्वजनिक संपत्तियों का समूह नहीं है जो कभी भी उपयोग नहीं किया जाता है (और हाँ, उन्हें भी सार्वजनिक होना चाहिए!)। तो मुझे लगता है कि यह गुणों की बजाय सार्वजनिक संपत्तियों की आवश्यकता है, मैं पूछताछ कर रहा हूं। – David

+0

ओह, और अन्य ऑरैकल प्रदाता लिंक के लिए धन्यवाद (दुर्भाग्य से यह मुझे व्यक्तिगत रूप से मदद नहीं करेगा क्योंकि मैं कहां काम करता हूं केवल ओडीपी.नेट है जिसका उपयोग किया जाता है) – David

+0

कोड में वास्तव में कुछ 'डुप्लिकेशंस' है क्योंकि आपको मानचित्र बनाना है कोड में और विशेषताओं के साथ मैप करने के लिए, लेकिन मुझे नहीं लगता कि यह एक बड़ी समस्या है। यह एक समस्या है लेकिन एक बड़ा नोग। – Theo

0

आप अपने व्यवसाय ऑब्जेक्ट को एक निजी सदस्य के रूप में सेट कर सकते हैं और गुणों को संबंधित गुणों में मैप कर सकते हैं।

हालांकि यह कोई कार्यक्षमता प्रदान नहीं करता है, कम से कम वे उपयोग किए जाने पर सही ढंग से कार्य करेंगे।

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