@@ -740,9 +740,7 @@ private async Task InstanceAlreadyLoadedAsync(DbDataReader rs, int i, ILoadable
740
740
return ;
741
741
}
742
742
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 ) ;
746
744
}
747
745
748
746
/// <summary>
@@ -755,7 +753,7 @@ private async Task<object> InstanceNotYetLoadedAsync(DbDataReader dr, int i, ILo
755
753
cancellationToken . ThrowIfCancellationRequested ( ) ;
756
754
object obj ;
757
755
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 ) ;
759
757
760
758
if ( optionalObjectKey != null && key . Equals ( optionalObjectKey ) )
761
759
{
@@ -764,7 +762,7 @@ private async Task<object> InstanceNotYetLoadedAsync(DbDataReader dr, int i, ILo
764
762
}
765
763
else
766
764
{
767
- obj = session . Instantiate ( instanceClass , key . Identifier ) ;
765
+ obj = session . Instantiate ( concretePersister , key . Identifier ) ;
768
766
}
769
767
770
768
// need to hydrate it
@@ -773,16 +771,16 @@ private async Task<object> InstanceNotYetLoadedAsync(DbDataReader dr, int i, ILo
773
771
// (but don't yet initialize the object itself)
774
772
// note that we acquired LockMode.READ even if it was not requested
775
773
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 ) ;
777
775
778
776
// materialize associations (and initialize the object) later
779
777
hydratedObjects . Add ( obj ) ;
780
778
781
779
return obj ;
782
780
}
783
781
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 ,
786
784
Action < IEntityPersister , CachePutData > cacheBatchingHandler , CancellationToken cancellationToken )
787
785
{
788
786
cancellationToken . ThrowIfCancellationRequested ( ) ;
@@ -794,11 +792,8 @@ private async Task UpdateLazyPropertiesFromResultSetAsync(DbDataReader rs, int i
794
792
return ; // No lazy properties were loaded
795
793
}
796
794
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 ) ;
802
797
// The property values will not be set when the entry status is Loading so in that case we have to get
803
798
// the uninitialized lazy properties from the loaded state
804
799
var uninitializedProperties = entry . Status == Status . Loading
@@ -822,7 +817,7 @@ private async Task UpdateLazyPropertiesFromResultSetAsync(DbDataReader rs, int i
822
817
? EntityAliases [ i ] . SuffixedPropertyAliases
823
818
: GetSubclassEntityAliases ( i , persister ) ;
824
819
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 ) )
826
821
{
827
822
return ;
828
823
}
@@ -882,18 +877,13 @@ internal static async Task UpdateCacheForEntityAsync(
882
877
/// an array of "hydrated" values (do not resolve associations yet),
883
878
/// and pass the hydrated state to the session.
884
879
/// </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 ,
886
881
LockMode lockMode , ILoadable rootPersister ,
887
882
ISessionImplementor session , CancellationToken cancellationToken )
888
883
{
889
884
cancellationToken . ThrowIfCancellationRequested ( ) ;
890
885
object id = key . Identifier ;
891
886
892
- // Get the persister for the _subclass_
893
- ILoadable persister = instanceClass == rootPersister . EntityName
894
- ? rootPersister
895
- : ( ILoadable ) Factory . GetEntityPersister ( instanceClass ) ;
896
-
897
887
if ( Log . IsDebugEnabled ( ) )
898
888
{
899
889
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
921
911
/// <summary>
922
912
/// Determine the concrete class of an instance for the <c>DbDataReader</c>
923
913
/// </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 )
925
915
{
926
916
cancellationToken . ThrowIfCancellationRequested ( ) ;
927
917
if ( persister . HasSubclasses )
@@ -939,9 +929,11 @@ private async Task<string> GetInstanceClassAsync(DbDataReader rs, int i, ILoadab
939
929
persister . EntityName ) ;
940
930
}
941
931
942
- return result ;
932
+ return persister . EntityName == result
933
+ ? persister
934
+ : ( ILoadable ) Factory . GetEntityPersister ( result ) ;
943
935
}
944
- return persister . EntityName ;
936
+ return persister ;
945
937
}
946
938
947
939
/// <summary>
0 commit comments