I've now created a pull request for this change: https://github.com/nhibernate/nhibernate-core/pull/50
On 31 Dez. 2011, 07:20, CSharper <[email protected]> wrote: > Hi, > > I was experimenting a little with the stateless session and the next > SQL Server version (will follow in a separate post). > > I found that when eager fetching entities like this... > using (var session = > sessionFactory.OpenStatelessSession()) > using (var transaction = session.BeginTransaction()) > { > var list = session.Query<Order>() > .FetchMany(a => a.OrderLines) > .ThenFetch(p => p.Product).ToList(); > Assert.AreEqual(2, list.Count(a => a.OrderLines > .Any(p => p.Product.Name.Contains("soft")))); > } > > ... I get too many aggregate roots in the result, there are duplicate > instances for the same entity. For the stateless session it might be > even more important that the join fetch works as expected because lazy > loading is disabled for it. > > With a small modification that would be fixed without the need to use > some result transformers. The stateless session uses a temporary > stateful persistence context and while a Query we could use its > already loaded entities to maintain the object identity thus > deduplicating the result. After the query is finished, the persistence > context is cleared so there is side effect for later queries. I've run > the NHibernate.Test unit tests and they work fine except for those > that have been red on my machine before the change. > > As I am not experienced yet with the development process, I just post > the patch and somebody can tell me what to do or take on the hands on > his/her own. Is somebody interested in following that patch? > > The patch in StatelessSessionImpl.cs is as follows: > @@ -449,11 +449,17 @@ namespace NHibernate.Impl > } > > public override object GetEntityUsingInterceptor(EntityKey > key) > { > CheckAndUpdateSessionStatus(); > - return null; > + // while a pending Query we should use existing temporary > entities so a join fetch does not create multiple instances > + // of the same parent item > + object obj; > + if > (temporaryPersistenceContext.EntitiesByKey.TryGetValue(key, out obj)) > + return obj; > + else > + return null; > } > > public override IPersistenceContext PersistenceContext > { > get { return temporaryPersistenceContext; }
