Carica con entusiasmo le raccolte in NHibernate utilizzando l'API Criteria
Domanda
Ho un'entità A che ha molte entità B ed entità C.Tutte le entità A, B e C hanno alcuni riferimenti x, y e z che dovrebbero essere caricati con entusiasmo.
Voglio leggere dal database tutte le entità A e caricare con entusiasmo le raccolte di B e C utilizzando i criteri API.Finora, sono in grado di recuperare con entusiasmo i riferimenti in "A".Ma quando le raccolte vengono caricate, i riferimenti al loro interno vengono caricati pigramente.
Ecco come lo faccio
AllEntities_A =
_session.CreateCriteria(typeof(A))
.SetFetchMode("x", FetchMode.Eager)
.SetFetchMode("y", FetchMode.Eager)
.List<A>().AsQueryable();
La mappatura dell'entità A utilizzando Fluent è come mostrata di seguito._B e _C sono IList privati rispettivamente per B e C in A.
Id(c => c.SystemId);
Version(c => c.Version);
References(c => c.x).Cascade.All();
References(c => c.y).Cascade.All();
HasMany<B>(Reveal.Property<A>("_B"))
.AsBag()
.Cascade.AllDeleteOrphan()
.Not.LazyLoad()
.Inverse()
.Cache.ReadWrite().IncludeAll();
HasMany<C>(Reveal.Property<A>("_C"))
.AsBag()
.Cascade.AllDeleteOrphan()
.LazyLoad()
.Inverse()
.Cache.ReadWrite().IncludeAll();
Non voglio apportare modifiche al file di mappatura e vorrei caricare con entusiasmo l'intera entità A.cioè.Dovrei ottenere un elenco di A dove ci sarà un elenco di B e C le cui proprietà di riferimento verranno caricate con entusiasmo
Soluzione
Stai cercando di creare un prodotto cartesiano qui.Penso che NHibernate richieda la mappatura delle relazioni come insiemi anziché come sacchetti per farlo, poiché i sacchetti consentono duplicati.
In ogni caso, i prodotti cartesiani sono molto inefficienti.Utilizza invece una query multipla o query future.
Vedere:
- Ibernazione:caricamento impaziente di due raccolte figlie (una delle quali è un elenco di componenti)
- https://nhibernate.jira.com/browse/NH-1471
- http://nhibernate.info/blog/2008/09/06/eager-loading-aggregate-with-many-child-collections.html
- http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx