/// <summary> /// Read one collection element from the current row of the ADO.NET result set /// </summary> private static void ReadCollectionElement(object optionalOwner, object optionalKey, ICollectionPersister persister, ICollectionAliases descriptor, IDataReader rs, ISessionImplementor session) { IPersistenceContext persistenceContext = session.PersistenceContext; object collectionRowKey = persister.ReadKey(rs, descriptor.SuffixedKeyAliases, session); if (collectionRowKey != null) { // we found a collection element in the result set if (log.IsDebugEnabled) { log.Debug("found row of collection: " + MessageHelper.InfoString(persister, collectionRowKey)); } object owner = optionalOwner; if (owner == null) { owner = persistenceContext.GetCollectionOwner(collectionRowKey, persister); if (owner == null) { //TODO: This is assertion is disabled because there is a bug that means the // original owner of a transient, uninitialized collection is not known // if the collection is re-referenced by a different object associated // with the current Session //throw new AssertionFailure("bug loading unowned collection"); } } IPersistentCollection rowCollection = persistenceContext.LoadContexts.GetCollectionLoadContext(rs).GetLoadingCollection(persister, collectionRowKey); if (rowCollection != null) { rowCollection.ReadFrom(rs, persister, descriptor, owner); } } else if (optionalKey != null) { // we did not find a collection element in the result set, so we // ensure that a collection is created with the owner's identifier, // since what we have is an empty collection if (log.IsDebugEnabled) { log.Debug("result set contains (possibly empty) collection: " + MessageHelper.InfoString(persister, optionalKey)); } persistenceContext.LoadContexts.GetCollectionLoadContext(rs).GetLoadingCollection(persister, optionalKey); // handle empty collection } // else no collection element, but also no owner }