@@ -740,9 +740,7 @@ private async Task InstanceAlreadyLoadedAsync(DbDataReader rs, int i, ILoadable
740740 return ;
741741 }
742742
743- var instanceClass = await ( GetInstanceClassAsync ( rs , i , persister , key . Identifier , session , cancellationToken ) ) . ConfigureAwait ( false ) ;
744- entry = entry ?? session . PersistenceContext . GetEntry ( obj ) ;
745- await ( UpdateLazyPropertiesFromResultSetAsync ( rs , i , obj , instanceClass , key , entry , persister , session , cacheBatchingHandler , cancellationToken ) ) . ConfigureAwait ( false ) ;
743+ await ( UpdateLazyPropertiesFromResultSetAsync ( rs , i , obj , key , entry , persister , session , cacheBatchingHandler , cancellationToken ) ) . ConfigureAwait ( false ) ;
746744 }
747745
748746 /// <summary>
@@ -755,7 +753,7 @@ private async Task<object> InstanceNotYetLoadedAsync(DbDataReader dr, int i, ILo
755753 cancellationToken . ThrowIfCancellationRequested ( ) ;
756754 object obj ;
757755
758- string instanceClass = await ( GetInstanceClassAsync ( dr , i , persister , key . Identifier , session , cancellationToken ) ) . ConfigureAwait ( false ) ;
756+ ILoadable concretePersister = await ( GetConcretePersisterAsync ( dr , i , persister , key . Identifier , session , cancellationToken ) ) . ConfigureAwait ( false ) ;
759757
760758 if ( optionalObjectKey != null && key . Equals ( optionalObjectKey ) )
761759 {
@@ -764,7 +762,7 @@ private async Task<object> InstanceNotYetLoadedAsync(DbDataReader dr, int i, ILo
764762 }
765763 else
766764 {
767- obj = session . Instantiate ( instanceClass , key . Identifier ) ;
765+ obj = session . Instantiate ( concretePersister , key . Identifier ) ;
768766 }
769767
770768 // need to hydrate it
@@ -773,16 +771,16 @@ private async Task<object> InstanceNotYetLoadedAsync(DbDataReader dr, int i, ILo
773771 // (but don't yet initialize the object itself)
774772 // note that we acquired LockMode.READ even if it was not requested
775773 LockMode acquiredLockMode = lockMode == LockMode . None ? LockMode . Read : lockMode ;
776- await ( LoadFromResultSetAsync ( dr , i , obj , instanceClass , key , acquiredLockMode , persister , session , cancellationToken ) ) . ConfigureAwait ( false ) ;
774+ await ( LoadFromResultSetAsync ( dr , i , obj , concretePersister , key , acquiredLockMode , persister , session , cancellationToken ) ) . ConfigureAwait ( false ) ;
777775
778776 // materialize associations (and initialize the object) later
779777 hydratedObjects . Add ( obj ) ;
780778
781779 return obj ;
782780 }
783781
784- private async Task UpdateLazyPropertiesFromResultSetAsync ( DbDataReader rs , int i , object obj , string instanceClass , EntityKey key ,
785- EntityEntry entry , ILoadable rootPersister , ISessionImplementor session ,
782+ private async Task UpdateLazyPropertiesFromResultSetAsync ( DbDataReader rs , int i , object obj , EntityKey key ,
783+ EntityEntry optionalEntry , ILoadable rootPersister , ISessionImplementor session ,
786784 Action < IEntityPersister , CachePutData > cacheBatchingHandler , CancellationToken cancellationToken )
787785 {
788786 cancellationToken . ThrowIfCancellationRequested ( ) ;
@@ -794,11 +792,8 @@ private async Task UpdateLazyPropertiesFromResultSetAsync(DbDataReader rs, int i
794792 return ; // No lazy properties were loaded
795793 }
796794
797- // Get the persister for the _subclass_
798- var persister = instanceClass == rootPersister . EntityName
799- ? rootPersister
800- : ( ILoadable ) Factory . GetEntityPersister ( instanceClass ) ;
801-
795+ var persister = await ( GetConcretePersisterAsync ( rs , i , rootPersister , key . Identifier , session , cancellationToken ) ) . ConfigureAwait ( false ) ;
796+ var entry = optionalEntry ?? session . PersistenceContext . GetEntry ( obj ) ;
802797 // The property values will not be set when the entry status is Loading so in that case we have to get
803798 // the uninitialized lazy properties from the loaded state
804799 var uninitializedProperties = entry . Status == Status . Loading
@@ -822,7 +817,7 @@ private async Task UpdateLazyPropertiesFromResultSetAsync(DbDataReader rs, int i
822817 ? EntityAliases [ i ] . SuffixedPropertyAliases
823818 : GetSubclassEntityAliases ( i , persister ) ;
824819
825- if ( ! await ( persister . InitializeLazyPropertiesAsync ( rs , id , obj , rootPersister , cols , updateLazyProperties , fetchAllProperties , session , cancellationToken ) ) . ConfigureAwait ( false ) )
820+ if ( ! await ( persister . InitializeLazyPropertiesAsync ( rs , id , obj , cols , updateLazyProperties , fetchAllProperties , session , cancellationToken ) ) . ConfigureAwait ( false ) )
826821 {
827822 return ;
828823 }
@@ -882,18 +877,13 @@ internal static async Task UpdateCacheForEntityAsync(
882877 /// an array of "hydrated" values (do not resolve associations yet),
883878 /// and pass the hydrated state to the session.
884879 /// </summary>
885- private async Task LoadFromResultSetAsync ( DbDataReader rs , int i , object obj , string instanceClass , EntityKey key ,
880+ private async Task LoadFromResultSetAsync ( DbDataReader rs , int i , object obj , ILoadable persister , EntityKey key ,
886881 LockMode lockMode , ILoadable rootPersister ,
887882 ISessionImplementor session , CancellationToken cancellationToken )
888883 {
889884 cancellationToken . ThrowIfCancellationRequested ( ) ;
890885 object id = key . Identifier ;
891886
892- // Get the persister for the _subclass_
893- ILoadable persister = instanceClass == rootPersister . EntityName
894- ? rootPersister
895- : ( ILoadable ) Factory . GetEntityPersister ( instanceClass ) ;
896-
897887 if ( Log . IsDebugEnabled ( ) )
898888 {
899889 Log . Debug ( "Initializing object from DataReader: {0}" , MessageHelper . InfoString ( persister , id ) ) ;
@@ -921,7 +911,7 @@ private async Task LoadFromResultSetAsync(DbDataReader rs, int i, object obj, st
921911 /// <summary>
922912 /// Determine the concrete class of an instance for the <c>DbDataReader</c>
923913 /// </summary>
924- private async Task < string > GetInstanceClassAsync ( DbDataReader rs , int i , ILoadable persister , object id , ISessionImplementor session , CancellationToken cancellationToken )
914+ private async Task < ILoadable > GetConcretePersisterAsync ( DbDataReader rs , int i , ILoadable persister , object id , ISessionImplementor session , CancellationToken cancellationToken )
925915 {
926916 cancellationToken . ThrowIfCancellationRequested ( ) ;
927917 if ( persister . HasSubclasses )
@@ -939,9 +929,11 @@ private async Task<string> GetInstanceClassAsync(DbDataReader rs, int i, ILoadab
939929 persister . EntityName ) ;
940930 }
941931
942- return result ;
932+ return persister . EntityName == result
933+ ? persister
934+ : ( ILoadable ) Factory . GetEntityPersister ( result ) ;
943935 }
944- return persister . EntityName ;
936+ return persister ;
945937 }
946938
947939 /// <summary>
0 commit comments