2009-10-01 57 views
9

我們應用程序中的數據訪問層將使用Oracle的UDT功能。我們只會將UDT對象傳入和傳出數據庫。如何在不使用OracleObjectMappingAttribute的情況下從Oracle UDT與ODP.NET進行映射?

目前,我們使用生成提供了ODP.NET的功能(產生,我們真的不希望在我們的代碼庫一個真正可怕的尋找類)的自定義類。

然後,我們使用一個單獨的映射類,(保存時和後面)的自定義類映射到我們的業務對象之一。

我想找到一個更好的方法來做到這一點。

我想我只是做外賣與生成的類,只是寫的實施IOracleCustomType一個映射類。 From/ToCustomObject方法將從我的UDT映射到我的業務對象。 但是,當我嘗試它時,這導致了我的問題 - 我得到錯誤「對象屬性未映射到自定義類型成員」。 看來,這兩個方法,我也需要我的映射類中的屬性 - UDT中每個項目的一個屬性。

例如 - 工作流UDT包含三個項目 - 狀態,創建時間和創建。 我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; } 
} 

我想從一個到另一個獲得而無需添加甲骨文代碼到業務對象。

所以我的想法是創建一個映射類是這樣的:

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類和框架(例如WCF)中已經有很多屬性。不喜歡的屬性幾乎與不喜歡.NET相同。

反正你可以探索devart的Oracle提供(http://www.devart.com/dotconnect/oracle/)的可能性。他們也有免費版本。它處理udts是基於字符串而不是屬性。

+4

有什麼不好的是,他們不應該需要。屬性本身永遠不會被獲取或設置,它們需要的唯一原因是因爲每個UDT屬性似乎都需要其中一個OracleObjectMappingAttribute。在一個從未使用過的類中擁有一堆公共屬性似乎是瘋狂的(是的,它們也必須公開!)。所以我想這是對我質疑的公共財產的需求,而不是屬性。 – David 2009-10-02 08:55:54

+0

哦,並感謝你的其他oracle提供商的鏈接(不幸的是,這不會幫助我個人,因爲我工作的地方只是使用ODP.NET) – David 2009-10-02 08:56:59

+0

代碼中確實存在一些「重複」,因爲您必須映射在代碼中,並與屬性映射,但我不認爲這是一個大問題。這是一個問題,但是一個大問題。 – Theo 2009-10-02 10:25:52

0

您可以將您的BusinessObject設置爲私有成員並將屬性映射到相應的屬性。

雖然這並不提供任何功能,至少他們會正確使用是否發揮作用。

相關問題