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