Einfache C# Objekte (POCO) mit dem Entity Framework lesen ...

Gerade nutze ich das Entity Framework, das seit dem Servicepack 1 für .NET Framework 3.5 verfügbar ist. Mit dem Entity Framework ist ein objektorientierter Zugriff aus C# und VB.NET auf relatione und andere Datenquellen möglich. Die Datenquellen müssen dazu einen Entityprovider haben. Dieser Provider greift dann via den ADO.NET Provider auf eine Datenbank zu. Kombiniert mit Linq vereinfacht sich der Zugriff im Programmcode auf Daten und Objekte sehr.

Da ich einige Änderungen an Datenschnittstellen in existierenden Projekte habe, wollte ich das Entityframework dort nutzen. ABER ... - da es sich um existierenden Code handelt, möchte ich die bisher verwendeten POCO C#-Klassen weiterverwenden und nicht meine gesamtes Anwendungsmodell auf neue Klassen umstellen. (Anmerkung= Einfachste C# Objekte/Klassen werden auch als POCO - Plain Old CLR Objects - bezeichnet).
Weiterhin denke ich auch, dass Datenzugriffstechnologien am Besten in einer Datenzugriffsschicht gekapselt sind und somit der direkte Zugriff auf die Datenbank ausserhalb dieser Schicht nicht möglich sein sollte.

Frage: Wie kann ich nun das Entityframework gemeinsam mit meinen POCO Klassen verwenden?

Zuerst habe ich auf dem C# Projekt im Contextmenu "Add New Item --> ADO.NET Entity Data Model" ausgewählt.

image

Danach musste ich noch die Datenquelle angeben und die Option automatisch generieren auswählen. Fertig ...

image

Jetzt kann ich von Code aus ganz bequem auf die Datenbankobjekte als C#-Objekte zugreifen und diese im Code verwenden und natürlich auch in einfache, eigne, nicht EntityFramework generierte C#-Objekte überführen und benutzen!

Beispiel einer POCO Klasse:

 namespace BE {
    public class BeOrder {
        public System.Int32 OrderID { get; set; }
        public System.String CustomerID { get; set; }
        public System.Int32? EmployeeID { get; set; }
        public System.DateTime? OrderDate { get; set; }
        public System.DateTime? RequiredDate { get; set; }
        public System.DateTime? ShippedDate { get; set; }
        public System.Int32? ShipVia { get; set; }
        public System.Decimal? Freight { get; set; }
        public System.String ShipName { get; set; }
        public System.String ShipAddress { get; set; }
        public System.String ShipCity { get; set; }
        public System.String ShipRegion { get; set; }
        public System.String ShipPostalCode { get; set; }
        public System.String ShipCountry { get; set; }
   }
}

Um diese aus dem Entityobjekt zu befüllen habe ich folgende Linqcodesequenz benutzt:

  List<BE.BeOrder> lstOrders = (from o in northwindDbCtx.Orders
  where o.OrderDate > new DateTime( 1998, 01, 01 ) && (o.OrderID > 10000 && o.OrderID < 20000)
  select new BE.BeOrder {
  CustomerID = o.Customers.CustomerID,
  EmployeeID = o.EmployeeID,
  Freight = o.Freight,
  OrderDate = o.OrderDate,
  OrderID = o.OrderID,
  RequiredDate = o.RequiredDate,
  ShipAddress = o.ShipAddress,
  ShipCity = o.ShipCity,
  ShipCountry = o.ShipCountry,
  ShipName = o.ShipName,
  ShippedDate = o.ShippedDate,
  ShipPostalCode = o.ShipPostalCode,
  ShipRegion = o.ShipRegion,
  ShipVia = o.ShipVia } ).ToList<BE.BeOrder>();

Es ist sehr einfach; - im Select-Teil des Linkstatements wird für jeden Treffer ein Objekt BE.BeOrder angelegt.

==> "select new BE.Order ..."

(Anmerkung= Wichtig ist auch, dass der lange Zuweisungsteil im Visual Studio sehr gut durch Intellisense unterstützt wird. Ggf. könnte dieser Code generiert werden.)

Um auf die in der Linqquery generierten POCO Objekte zugreifen zu können, wird das Queryergebnis direkt in eine Generic Liste von BE.BeOrder Objekte konvertiert. ==> "ToList<BE.BeOrder>(); ..."

Viel Spass beim Ausprobieren - Gunnard