2013-04-07 9 views
5

Mein Domänenmodell liefert z.B. folgendes Objekt Report : IEntity<Report>. Ich erhalte normalerweise Oracle-Formularobjekt-Objekt (oder Sammlungsarten) Formular gespeicherte Prozeduren. Für alle Typen werden C# -Klassen vom ODP.NET Visual Studio Custom Class-Assistenten generiert. So haben folgende I Klasse z.B .:Wie integriere ich ODP.NET in Repository-Klassen?

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

Derzeit Ich versuche, eine neue Datenzugriffsschicht für eine C# .NET-Anwendung zu erstellen. Ich möchte in diesem Fall das Repository-Muster anwenden, um eine lose Kopplung und bessere Testbarkeit zu erreichen. Aber wie integriert man diese generierten Klassen in Repositories? Wie gestaltet man die Klasse ReportRepository?

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

Sollte ich folgenden Ansatz verwenden? Eine statische DB-Proxy-Klasse, die z. stellt eine generische Read<T>()-Methode mit einem bestimmten Delegaten für Datenabruf und -zuordnung bereit. Und eine Fabrik zum Erstellen des DB-Providers.

Und folgende Delegate wird zum Abrufen des verwandten UDT-Objekts und Zuordnung zu dem Domänenobjekt, z. 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; 
}; 

Was halten Sie von diesem Ansatz? Gibt es bessere Ansätze für die Integration von ODP.NET-Typen in Repositories? Oder sollte ich generierte UDT-Klassen vermeiden und stattdessen einen ORM-Frame hinzufügen?

Antwort

0

Als ich zuerst EF annahm, verwendete ich Interfaces & Repositories, aber ich fand, dass sie sehr wenig Wert hinzufügten. Hier ist ein Beispiel, wie unser Stack jetzt aussieht.

Kontext:

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 

Beispiel 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 

Probe 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-note, ich bin nicht su Warum sollten Sie die Procs schreiben, um den Abruf durchzuführen? Schadet das nicht dem Zweck, EF zu benutzen? Das macht es für dich.

+0

Vielen Dank, dass Sie mir einen Einblick in Ihre Implementierung des Datenzugriffs gegeben haben. Momentan verwende ich keine EF. Meine Entity-Klassen sind C# -Klassen, die von den Oracle Developer Tools für Visual Studio (dem Custom Class Wizard) generiert werden. Ich muss mich auf gespeicherte Prozeduren als Schnittstelle (Sicherheitsrichtlinie) verlassen. Stored Procedures und EF können mit Referenzen als Ausgabeparameter arbeiten. Die Felder des Cursors können Entitäten zugeordnet werden. Es gibt keine Möglichkeit, Oracle UDT-Objekte EF-Entitäten zuzuordnen. –

+0

Ich werde versuchen, einige Fakten über die aktuelle Situation aufzuhellen: - Gespeicherte Prozeduren sind erforderlich (keine parametrisierte/dynamische SQL). - Die meisten Prozeduren geben Objekte zurück ([Oracle UDT-Objekte] [1]) - Von Oracle Visual Studio Tools generierte C# -Klassen werden als Entitätsklassen verwendet. - Zur Zeit wird kein ORM verwendet (kein EF/no-Nhibernate). [1] http://docs.oracle.com/html/E10927_01/featUDTs.htm Und ich möchte das Design des Datenzugriffscodes verbessern. –

Verwandte Themen