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; }

Reply via email to