41.2 Datenabfrage mit Hilfe der POCOs
So weit wäre alles vorbereitet. Nun sollen die Klassen und das Konzept der POCOs noch getestet werden. Dazu schreiben wir in der Methode Main den folgenden Programmcode:
using (NorthwindContext context = new NorthwindContext())
{
var query = from p in context.Products
where p.Category.CategoryID == 1
select p;
foreach (var item in query)
Console.WriteLine(item.ProductName);
Console.ReadLine();
}
Listing 41.3 Testen der POCO-Klassen
Sie finden das gesamte Projekt auf der Buch-DVD unter ...\Beispiele\Kapitel 41\POCO_ Sample1.
41.2.1 In Beziehung stehende Daten laden

Wir müssen an dieser Stelle auch ein paar Worte über das Nachladen verknüpfter Objekte verlieren. In Kapitel 38 haben Sie gelernt, dass Ihnen dazu mit den Methoden Include und Load sowie mit dem Lazy Loading (Deferred Loading) mehrere Möglichkeiten zur Verfügung stehen, EntityObject-Entitäten abzurufen. Natürlich können Sie auch verknüpfte POCO-Entitäten abrufen. Allerdings sind dabei Unterschiede zu beachten – je nachdem, welche Lademethode Sie verwenden.
Die Methode »Include«
Zu der Methode Include, mit der verknüpfte Objekte mit Eager Loading zurückgegeben werden, gibt es nichts weiter zu sagen. Es funktioniert mit POCO-Entitäten genauso wie mit EntityObject-Entitäten.
Laden verknüpfter POCO-Entitäten mit »LoadProperty«
Mit der Methode Load lassen sich verknüpfte EntityObject-Entitäten über die Navigationseigenschaften nachladen. Die Methode wird auf Objekte vom Typ EntityCollection oder EntityReference aufgerufen.
Nun ist es Fakt, dass die Navigationseigenschaften der POCO-Entitäten nicht vom Typ EntityCollection bzw. EntityReference sind. Infolgedessen steht die Load-Methode den POCO-Objekten nicht zur Verfügung. Aus diesem Grund bietet der Objektkontext mit seiner Methode LoadProperty für POCO-Entitäten eine gleichwertige Alternative an.
Wie Sie die LoadProperty-Methode einsetzen können, zeigt das folgende Listing, in dem die verknüpften Produkte einer bestimmten Kategorie abgerufen werden.
using (NorthwindContext context = new NorthwindContext())
{
var cat = context.Categories.First();
context.LoadProperty(cat, c => c.Products);
foreach (var item in cat.Products)
Console.WriteLine(item.ProductName);
}
Listing 41.4 Der Einsatz der Methode »LoadProperty«
Lazy Loading mit POCO-Entitäten
Beim Lazy Loading werden verknüpfte Entitäten beim Zugriff auf eine Navigationseigenschaft automatisch aus der Datenbank nachgeladen. Auch POCOs unterstützen das Lazy Loading. Allerdings muss man dazu auf einen kleinen Trick zurückgreifen: Sie müssen alle Navigationseigenschaften in den POCO-Klassen mit dem Modifizierer virtual kennzeichnen. Um Lazy Loading in unseren POCO-Klassen Product und Category zu ermöglichen, sind also die folgenden Änderungen notwendig:
public class Category {
...
public virtual ICollection<Product> Products { get; set; }
}
public class Product {
...
public virtual Category Category { get; set; }
}
Listing 41.5 POCO-Klassen auf das Lazy Loading vorbereiten
Das ist aber noch nicht alles. In einem weiteren Schritt muss das Lazy Loading des Objektkontextes mit
context.ContextOptions.LazyLoadingEnabled = true;
aktiviert werden.
Das folgende Listing 41.6 zeigt, wie mittels Lazy Loading die Anzahl der Produkte je Kategorie ermittelt werden kann. In dem Beispiel wird die Anzahl der Produkte ermittelt, die zu jeder Kategorie gehören.
using (NorthwindContext context = new NorthwindContext())
{
// Lazy Loading aktivieren
context.ContextOptions.LazyLoadingEnabled = true;
var query = from cat in context.Categories
select cat;
foreach (var item in query)
Console.WriteLine("Kategorie: {0,-15}Anzahl der Produkte: {1}",
item.CategoryName, item.Products.Count());
}
Listing 41.6 Das Lazy Loading testen
Aktivieren Sie das Lazy Loading nicht, erhalten Sie als Ergebnis des Aufrufs zu jeder Kategorie die Zahl »0« ausgegeben.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.