Eager Loading mit dem Entity Framework

Geschreiben von Marcus Kimpenhausauf1. Dezember 2008 in entwicklung |

Wie ich Manuel gerade schon geschrieben habe: Wer meckert muss auch mal loben können!

Und meiner Meinung nach ist das Eager Loading im Entity Framework akzeptabel gelöst. Eager Laoding ist im Gegensatz zum Lazy Loading das Laden, welches Abhängigkeiten direkt mitlädt und nicht erst bei einem Zugriff tarnsparent nachlädt. Wozu das Ganze?! Nun wie ich finde gibt es viele Anwendungsfälle in denen der Zugriff auf Details eines Datensatzes schon feststeht – warum diese also transparent in einem weiteren Datenbankzugriff nachladen, wenn man sie direkt mitladen kann?? Eben!

Ein klassiches Beispiel wäre: Rechnung -> Rechnungsposition -> Einheit

Es gibt also eine Rechnung mit n-Rechnunspositionen und jede dieser Positionen enthält eine Einheit des verkauften Gutes. Datenbanktechnisch ist dies natürlich Normalisiert worde und liegt deshalb in einer zusätzlichen Entität vor.

Typischerweise würden einige sicher das ganz so programmieren (zumindest mit einem ORM-Ansatz):

var rechnungen = from eRechnungen in entities.RechnungSet select eRechnungen;

foreach (Rechnung rechnung in rechnungen)
{
    rechnung.Rechnungspositionen.Load();

    foreach(Rechnungsposition position in rechnung.Rechnungspositionen)
    {
         position.EinheitReference.Load();
         position.Einheit.....
    }
}

Dies wäre eine logische Abbildung des Aufbaus des Datenmodells – nur leider auf Grund der vielen unnötigen Datenbankabfragen eine inperformante Lösung. Bei 1 Rechnung mit 10 Positionen wären dies ganze 21 Datenbankzugriffe – au backe!

Eager Loading vereinfacht dies etwas:

var rechnungen = from eRechnungen in entities.RechnungSet.Include("Rechnungspositionen").Include("Rechnungspositionen.Einheit") select eRechnungen;

foreach (Rechnung rechnung in rechnungen)
{
    foreach(Rechnungsposition position in rechnung.Rechnungspositionen)
    {
        position.Einheit.....
    }
}

Durch die Include-Anweisungen wird das generierte SQL-Statement entsprechend erweitert, so dass sowohl die Positionen als auch deren Einheiten beim ersten Datenbankzugriff mitgeldaden werden. Klasse – so werden alle benötigten Daten in 1 Datenbankzugriff geladen!

Die Include-Funktion erwartet eine Pfad-Angabe als String. Diese kann geschachtelt werden, so das über mehrere Ebenen hinweg die Daten bereits mitselektiert werden können. Einziger Nachteil wie ich finde – bei Änderung der Property-Namen entfällt der Kompiletimecheck… aber für den Anfang nicht so schlecht ;-)

Einen Blog-Eintrag aus dem ADO.NET-Team findet sich hier: http://blogs.msdn.com/adonet/archive/2008/10/07/migrating-from-linq-to-sql-to-entity-framework-eager-loading.aspx – zwar als Vergleich zu Linq2SQL, aber man kann das wesentliche zu Eager Loading mittels Entity Framework nachlesen.

Schlagwörter:, ,

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Get Adobe Flash playerPlugin by wpburn.com wordpress themes

Copyright © 2005-2010 marcus' tagebuch All rights reserved.
Desk Mess Mirrored v1.7 theme from BuyNowShop.com.