Attualmente sto utilizzando un approccio basato sugli attributi per inibire la gestione delle sessioni, il che significa che la sessione è aperta per la durata del metodo Action, ma viene chiusa una volta superato il controllo alla vista.Nhibernate/MVC: gestione delle raccolte lazy load in Visualizza
Mi sembra una buona pratica per me, tuttavia sto correndo per problemi con le raccolte pigri caricate. (Ciò è complicato dal fatto che alcune raccolte sembrano caricarsi lentamente anche se hanno impostato Not.LazyLoad() nella mappatura fluente).
come la vedo io, le mie opzioni sono:
- cambiare la mia strategia di gestione ISession e mantenere la sessione aperta nel View
- fare un uso migliore delle ViewModels (io non sono attualmente usandoli ovunque).
- carico Eager tutte le collezioni che causano problemi (forse paging) (problema fluente non sopportare)
1 sembra un po 'sbagliato essere - ma può essere la soluzione 'semplice'. 2 è probabilmente il modo corretto per andare, ma in alcuni casi ViewModels sembra leggermente ridondante, e sono dispiaciuto di introdurre più classi solo per affrontare questo problema. 3 sembra essere un po 'una soluzione sporca.
Cosa ne pensi?
Grazie DanP. Ho provato a sperimentare con Automapper. Sembra molto promettente, tuttavia, quando eseguo il mapping di una raccolta sulla mia Entity a una raccolta su un ViewModel, sembra ancora attivare il caricamento lento (anche se la vista ha solo accesso al modello della vista). Posso solo supporre che i riferimenti al proxy vengano passati in questo caso. Hai qualche consiglio su come forzare Automapper a copiare attraverso gli oggetti reali dalla collezione (piuttosto che dai proxy)? – UpTheCreek
@UpTheCreek: semplice, usa anche raccolte di DTO. Impara a non mandare MAI qualcosa mappato in NHibernate (ad esempio le tue effettive classi di dominio) dal livello di servizio. Sembra scoraggiante, ma l'automapper lo rende davvero un gioco da ragazzi ... – DanP
Ah sì, è una sorpresa, grazie! – UpTheCreek