Dav*_*vid 9 .net c# oracle odp.net user-defined-types
我们的应用程序中的数据访问层将使用Oracle的UDT功能.我们只会将UDT对象传入和传出数据库.
目前,我们使用ODP.NET提供的函数生成自定义类(它创建了一个我们在代码库中真正不需要的真正可怕的类).
然后,我们使用单独的映射类将自定义类映射到我们的一个业务对象(并在保存时返回).
我想找到一个更好的方法来做到这一点.
我想我只是去处理生成的类,然后编写一个实现了IOracleCustomType的映射类.然后,From/ToCustomObject方法将从我的UDT映射到我的业务对象.但是,当我尝试它时,这会给我带来问题 - 我收到错误"对象属性未映射到自定义类型成员".看来这两个方法,我也需要我的映射类中的属性 - UDT中每个项目的一个属性.
例如,工作流UDT包含三个项目 - 状态,创建时间和创建时间.我的UDT很简单:
TYPE workflow_type AS OBJECT
(status VARCHAR2(8)
,created_by VARCHAR2(30)
,created_datetime DATE
);
Run Code Online (Sandbox Code Playgroud)
我希望它最终成为业务对象:
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; }
}
Run Code Online (Sandbox Code Playgroud)
我想从一个到另一个,而不必将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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是由于要求映射每个属性需要OracleObjectMappingAttribute(如在ODP.NET生成的类中),这不起作用.这显得非常愚蠢,因为我根本不会使用它们.事实上,我可以通过添加三行来使我的映射类工作:
[OracleObjectMappingAttribute("STATUS")] public string a;
[OracleObjectMappingAttribute("CREATED_BY")] public string b;
[OracleObjectMappingAttribute("CREATED_DATETIME")] public DateTime c;
Run Code Online (Sandbox Code Playgroud)
当然必须有一个更好的方法,而不是把这样一个可怕的黑客?毕竟,这些变量根本就没有被使用--ODP.NET似乎只需要它们来获取要映射的类型 - 但我想这可以通过不同的方式实现.思考?
这些额外的属性有什么不好呢?.net 类和框架(例如 WCF)中已经存在大量属性。不喜欢属性几乎与不喜欢 .NET 相同。
无论如何,您可以探索 devart 的 Oracle 提供商 ( http://www.devart.com/dotconnect/oracle/ )的可能性。他们也有免费版本。它处理 udts 是基于字符串而不是属性。
| 归档时间: |
|
| 查看次数: |
9970 次 |
| 最近记录: |