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
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.
--Blog Eng: http://www.codewrecks.com/blogBlog Ita: http://blogs.ugidotnet.org/rgmTwitter: http://twitter.com/alkampfer
Penso di aver capito.
Grazie