2013-04-07 27 views
5

Mô hình tên miền của tôi cung cấp ví dụ: đối tượng sau Report : IEntity<Report>. Tôi thường truy xuất các đối tượng được định nghĩa kiểu người dùng được xác định bởi Oracle (hoặc các loại bộ sưu tập). Đối với tất cả các loại C# lớp được tạo ra bởi các ODP.NET Visual Studio Custom Class Wizard. Vì vậy, tôi có lớp học sau, ví dụ:Làm cách nào để tích hợp ODP.NET vào các lớp Kho lưu trữ?

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

Hiện tại tôi đang cố gắng tạo lớp truy cập dữ liệu mới cho ứng dụng C#. Tôi muốn áp dụng các mô hình kho lưu trữ trong trường hợp này để đạt được khớp nối lỏng lẻo và kiểm tra tốt hơn. Nhưng làm cách nào để tích hợp các lớp được tạo này vào kho lưu trữ? Làm cách nào để thiết kế lớp học ReportRepository?

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

Tôi có nên sử dụng phương pháp tiếp cận sau không? Lớp proxy DB tĩnh, ví dụ: đưa ra phương thức chung Read<T>() với một đại biểu đã cho để truy xuất và ánh xạ dữ liệu. Và một nhà máy để tạo nhà cung cấp db.

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; 
     } 
    } 
} 

Và đại biểu sau được sử dụng để tìm nạp đối tượng UDT có liên quan và ánh xạ tới đối tượng miền, ví dụ: 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; 
}; 

Bạn nghĩ gì về phương pháp này? Có cách tiếp cận tốt hơn để tích hợp các loại ODP.NET trong kho lưu trữ? Hoặc tôi nên tránh tạo ra các lớp UDT và thêm một số khung ORM thay vào đó?

Trả lời

0

Khi lần đầu tiên tôi chấp nhận EF, tôi đã sử dụng Giao diện & Kho lưu trữ, nhưng tôi thấy rằng họ đã thêm rất ít giá trị. Đây là một ví dụ về cách chồng của chúng ta trông như thế nào bây giờ.

Bối cảnh:

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 

mẫu Entity:

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 

mẫu 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 

Side-lưu ý, tôi không su tại sao bạn muốn viết các procs để thực hiện truy xuất. Không phải kiểu đánh bại mục đích sử dụng EF sao? Nó làm điều đó cho bạn.

+0

Cảm ơn bạn đã cung cấp cho tôi một số thông tin chi tiết về triển khai truy cập dữ liệu của bạn. Hiện tại tôi không sử dụng EF. Các lớp Entity của tôi là các lớp C# được tạo bởi Oracle Developer Tools cho Visual Studio (Custom Class Wizard). Tôi đã dựa vào các thủ tục được lưu trữ dưới dạng giao diện (chính sách bảo mật). Các thủ tục được lưu trữ và EF có thể làm việc với các bộ phận ref như là paramater đầu ra. Các trường của con trỏ có thể được ánh xạ tới các thực thể. Không có cách nào để ánh xạ các đối tượng Oracle UDT tới các thực thể EF. –

+0

Tôi sẽ cố gắng hightlight một số sự kiện về tình hình hiện tại: - thủ tục được lưu trữ được yêu cầu (không có parametrized/năng động sql). - Hầu hết các thủ tục trả về các đối tượng ([đối tượng Oracle UDT] [1]) - Lớp C# được tạo bởi Oracle Visual Studio Tools được sử dụng làm lớp thực thể. - Hiện tại không có ORM nào được sử dụng (không có EF/no nhibernate). [1] http://docs.oracle.com/html/E10927_01/featUDTs.htm Và tôi muốn cải thiện thiết kế của mã Truy cập dữ liệu. –