Lazy Load? Eager Load? Altra soluzione?

rated by 0 users
This post has 2 Replies | 2 Followers

Top 25 Partecipanti
Post 6
Punteggio 105
PaoloB Posted: 07-09-2009 18.44

Ho avuto la brillante idea di cimentarmi nella creazione di un DAL personale e mi sono imbattuto in questo (comune?) problema. Ho la classica situazione:

Ordine -> Dettagli

DettaglioOrdine -> Articolo

Supponendo che Ordine abbia una proprietà Totale in sola lettura che ritorna la somma dei prezzi dei singoli Dettagli, se voglio leggere il Totale devo obbligatoriamente andare a recuperare tutti i Dettagli dell'Ordine. Se devo mostrare ad esempio tutti gli Ordini di un certo periodo (supponiamo sia una grande quantità) dovrò recuperare tutti gli oggetti relativi, con il conseguente carico di letture sul database.

Una soluzione potrebbe essere il lazy load per recuperare i Dettagli (e i relativi Articoli) solo se devo effettivamente accedere a loro, ma in questo caso sono obbligato a farlo quando vado a leggere la proprietà Totale.

Potrei impostare la proprietà Totale non come in sola lettura, in modo da assegnarle un valore attraverso la query con cui recupero l'Ordine, ma nel caso poi voglia recuperare i suoi Dettagli per poter modificare l'Ordine come mi comporto?

C'è un'altra soluzione più semplice che mi permetta di mantenere la proprietà Totale in sola lettura?

Grazie.

PaoloB

  • Inserito sotto:
  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 243
Punteggio 3.383

In questo caso, a meno che il totale non debba obbligatoriamente essere calcolato con qualche regola strana, è solitamente preferibile fare una proiezione, ad esempio una semplice somma dei subtotali dei dettagli.In Nhibernate ad esempio puoi mappare la proprietà come forumula e quindi gestirla senza problemi. La proprietà la tieni in sola lettura (perchè nhibernate può accedere ai membri privati, per cui la fai public get e private set) i dettagli sono un'altra proprietà completamente scorrelata. In questo caso attenzione però, che se tu carichi un ordine, poi aggiungi un elemeto ai dettagli, il valore della proprietà Total rimarrebbe eguale.

Alternativamente la proprietà Totale potrebbe semplicemente ciclare in tutti i dettagli, usare regole complesse etc etc e poi tornare il risultato. In questo caso quando recuperi l'oggetto ORdine potresti direttametne fare un eager load per non appesantire il db.

Alk.

 

  • | Punteggio Post: 20
Top 25 Partecipanti
Post 6
Punteggio 105

Penso di aver capito.

Grazie

  • | Punteggio Post: 5
Pagina 1 di 1 (3 elementi) | RSS
Powered by Community Server (Commercial Edition), by Telligent Systems