Imagina i have pretty complex model graph such as for an example:
Orchestra -> Musicians -> Instruments -> Properties
-> Items
-> Songs -> Parts
I know in theory how Futures works but how do i load this complete graph lets say for a concrete musician (specified by id).
I know that for each collection on same level i have to create simple one future query to avoid Cartesian product in same query. so when i execute code like this:
using(var session = GetSession()){
var instrumentQuery = session.QueryOver<Musicians>()
.Where(x=>x.Id == CONCRETEMUSICIANIDTHERE)
.JoinQueryOver<Instruments>(x=>x.Instruments)
.Future();
var instrumentProperties = = session.QueryOver<Musicians>()
.Where(x=>x.Id == CONCRETEMUSICIANIDTHERE)
.JoinQueryOver<Instrument>(x=>x.Instruments, ()=> instrumentAlias)
.JoinQueryOver<Property>(()=>instrumentAlias.Properties)
.Future();
var instrumentItems = = session.QueryOver<Musicians>()
.Where(x=>x.Id == CONCRETEMUSICIANIDTHERE)
.JoinQueryOver<Instrument>(x=>x.Instruments, ()=> instrumentAlias)
.JoinQueryOver<Item>(()=>instrumentAlias.Items)
.Future();
...
...CONTINUE same future queries for each unique collection
...
...
var result = session.QueryOver<Musician>()
.Where(x=>x.Id == CONCRETEMUSICIANIDTHERE)
.SingleOrDefault<Musician>(); //This query is not future so it should???? load all futures ???
return result;
}
But even when the last query is NOT future it wont send those FUTUR..ISH queries to DB ( i checked with SQL profiler... there is no such SQL heading to DB)
musician.instrument still throws lazy initialization exception.
This code is only demostrative and purely theoretical.
What i want to avoid is:
- using HQL ( i hate those magic strings...)
- Change mappings to load eagerly everything because there are use cases i need only musician and intrument ? (or any other subset)
- avoid N+1 queries problem here
- leave session open for too long because these data could change from other server instance
What i want to achieve
- either force nhibernate to correstly create and construct object structure from provided criteria.
or
- Force nhibernate to use fetch select for this query only
there is also simmilar question: How to load a large, complex object graph using NHibernate
and the answer is... Change your mappings... which i dont want because i dont see a point to load this complex graph for each use cast (even the simple ones)
Technical background:
- we use Nhibernate 4.0
- as a DB probably Azure DB or SQL Server will be used (or maybe postgreSQL)