Sui vari forum e blog se ne parla già molto. A quanto si legge, a volte sembra che ancora ci siano dei dubbi sul fatto che EF in qualche modo implementi Lazy Load. Non è così. Entity Framework in nessun modo implementa Lazy Load, come sostengono anche fonti più autorevoli di me.
EF permette al massimo di definire il Fetch Plan per le Navigation Property di una Entity; si può quindi decidere se caricare i riferimenti in modo Eager o Deferred.
Il caricamento Eager avviene indicando all'interno della query che si va ad eseguire quali sono le Navigation Property che si intendono caricare immeditamente, con il metodo Include; ad esempio se volessimo caricare una ipotetica Entity Customer e tutti gli Order ad essa associati, dovremmo fare qualcosa come:
var query = (from c in this.objectContext.Customers.Include("Orders")
where something
select c);
Il caricamento Deferred avviene in modo esplicito tramite la chiamata del metodo Load delle Navigation Property; supponiamo di volere caricare l'Entity Customer dell'esempio precedente, ma di voler caricare i suoi Order solo in un secondo momento, faremo quindi:
var query = (from c in this.objectContext.Customers
where something
select c);
Customers myCustomer = query.First();
myCustomer.Orders.Load();
Ovviamente il metodo Load ha effetto solo finchè l'Entity è associata ad un ObjectContext valido; in caso contrario verrà sollevata un eccezione.
Personalmente preferisco l'approccio di NHibernate, che implementa Lazy Load, nel quale il Fetch Plan delle Entity viene definito a livello di mapping, il caricamento delle relazioni avviene implicitamente (una delle differenze tra Lazy e Deffered Load) ed offre comunque l'opportunità di variarie il Fetch Plan a runtime, se necessario.
Ad ogni modo, concludendo, vorrei porre enfasi su quello che ritengo sia il problema principale, ovvero che si parli di Lazy Load in Entity Framework. Il concetto di Lazy Load non si ferma alla traduzione letterale del termine. Chiamare Lazy Load ciò che non lo è, e che forse gli assomiglia un pochino, genera solo confusione in chi vi legge (ascolta). Io per primo sono caduto nel tranello. Secondo me è fondamentale, sempre, "chiamare le cose col loro nome", in modo da creare un linguaggio comune, che non generi fraintendimenti o malintesi.
Matteo