如何将ODP.NET集成到Repository类中?

时间:2013-04-07 09:20:02

标签: c# oracle odp.net

我的域名模型提供了跟随对象Report : IEntity<Report>。 我通常检索Oracle用户定义的类型对象(或集合类型)表单存储过程。对于所有类型,C#类由ODP.NET Visual Studio自定义类向导生成。所以我有以下课程:例如:

public class UDT_REPORT : INullable, IOracleCustomType, IXmlSerializable {
    private bool m_IsNull;
    private decimal m_REPORT_ID;
    private decimal m_VALUE;                
    // etc
}

目前,我正在尝试为C#应用程序创建新的数据访问层。我想在这种情况下应用存储库模式,以实现松耦合和更好的可测试性。但是如何将这些生成的类集成到存储库中?如何设计ReportRepository类?

public interface IReportRepository
{         
    Report Find(ReportId id);
    IList<Report> FindAll();
    void Store(Report Report);
}

我应该使用以下方法吗? 一个静态数据库代理类,例如公开了一个带有给定委托的通用Read<T>()方法,用于数据检索和映射。还有一个用于创建数据库提供程序的工厂。

public static T Read<T>(string sql, Func<IDataReader, T> fetch, object[] parms = null)
{
    using (var connection = factory.CreateConnection())
    {
        connection.ConnectionString = connectionString;

        using (var command = factory.CreateCommand())
        {
            // Add connection; sql command text; 
                     // add parameters via some extension method   
            // Open and close connection                                                                         
            T t = default(T);
            var reader = command.ExecuteReader();
            if (reader.Read()) {
                t = fetch(reader);
            }
            return t;
        }
    }
}

以下委托用于获取相关的UDT对象并将其映射到域对象,例如Report

private static Func<IDataReader, Customer> Fetch = reader =>
{                                             
            UDT_REPORT report = reader.GetValue(reader.GetOrdinal("out_param_report"));
            Report report = Mapping.Map(reportEntity);          
            return report;
};

您如何看待这种方法?是否有更好的方法在存储库中集成ODP.NET类型?或者我应该避免生成UDT类并添加一些ORM帧吗?

1 个答案:

答案 0 :(得分:0)

当我第一次使用EF时,我使用了Interfaces&amp;存储库,但我发现它们增加了很少的价值。这是我们的堆栈现在看起来的一个例子。

<强>上下文

Imports System.Configuration
Imports System.Data.Entity
Imports System.Collections.Specialized

Imports Oracle.DataAccess.Client
Imports System.Reflection

Public Class MyContext
    Inherits System.Data.Entity.DbContext

    Public Property MyTables As DbSet(Of MyTable)

    Public Sub New()
        MyBase.New(
            New OracleConnection(
                ConfigurationManager.ConnectionStrings(
                    "Entities").ConnectionString
                ),
            True
        )
    End Sub

End Class

示例实体:

Imports System.ComponentModel.DataAnnotations
Imports System.ComponentModel.DataAnnotations.Schema

Public Class MyTable

    <Key()>
    <Required()>
    Public Property KeyColumn As Int64

    <StringLength(50)>
    <Column("LegacyColumnName")>
    Public Property Name As String

    <StringLength(1000)>
    Public Property Description As String

    <Required()>
    Public Property IsActive As Int64

    Public Property DateCreated As DateTime?

End Class

示例LINQ:

Public Function GetMyTables()
    Try
        Using MCTX As New MyContext()
            Return (
                From T In MCTX.MyTables
                Order By T.Name
                Select New With {
                    T.KeyColumn,
                    T.Name,
                    T.IsActive
                }).ToArray
        End Using
    Catch ex As Exception
        Return ReportException(
            "An error occurred trying to retrieve the table list", ex)
    End Try
End Function

旁注,我不确定你为什么要写proc来进行检索。是不是那种打败使用EF的目的?它为你做到了。