NHibernate QueryOver con Fetch che ha generato più query SQL e hit db

Sto provando a selezionare un’entity framework e recuperare un elenco correlato:

Session.QueryOver() .Fetch(x => x.UsersInRole).Eager .List(); 

Il che risulta in molti successi al database. Il primo è qualcosa del tipo:

  SELECT ... FROM UserRoles left outer join UsersInRoles on ... 

E altre centinaia di query separate che assomigliano a qualcosa:

  SELECT ... FROM UsersInRoles left outer join UserRoles on ... WHERE UserRoles.UserId=? 

La mapping è la seguente:

 public class UserRoleMap : ClassMap { public UserRoleMap() { Id(x => x.Id); Map(x => x.RoleName); HasManyToMany(x => x.UsersInRole) .Inverse() .LazyLoad() .Table("UsersInRoles"); } } 

    Direi che questo comportamento è ciò che dovremmo aspettarci. Diamo uno scenario, in cui abbiamo nel sistema 2 utenti e 2 ruoli

     User1 - Role1 // has only Role1 User2 - Role1 // now we see that Role2 has more then User1 User2 - Role2 

    Supponiamo che la prima query recuperi solo Utente1 e la sua relazione molti-a-molti Role1 . Quello che abbiamo in ISession al momento è solo User1 , quindi l’insieme di Users for Role1 è incompleto (non possiamo riutilizzare gli oggetti caricati in ISession al momento) . Ma come si dovrebbe sapere dove siamo? Che tutti i dati caricati per Role1 sono o non sono nella sessione?

    Nuova query, caricamento dei dati per Role1 deve essere emesso. E in questo modo, possiamo alla fine avere dosen di queste domande …

    Quello che vedo come la soluzione migliore (lo sto utilizzando in quasi tutti gli scenari) è l’impostazione della batch-size del batch-size : 19.1.5. Utilizzo del recupero in batch

     HasManyToMany(x => x.UsersInRole) ... .BatchSize(25) 

    Segna tutte le mappe della collezione con .BatchSize(25) e fallo anche per la mappa delle classi. Ciò causerà più di 1 script SQL, ma alla fine non più di 1 + (2-4) dipende dalle dimensioni del batch e dalla dimensione della pagina.