public EntityTrackingInfo( [NotNull] IEntityKeyFactorySource entityKeyFactorySource, [NotNull] IClrAccessorSource<IClrPropertyGetter> clrPropertyGetterSource, [NotNull] QueryCompilationContext queryCompilationContext, [NotNull] QuerySourceReferenceExpression querySourceReferenceExpression, [NotNull] IEntityType entityType) { Check.NotNull(entityKeyFactorySource, nameof(entityKeyFactorySource)); Check.NotNull(clrPropertyGetterSource, nameof(clrPropertyGetterSource)); Check.NotNull(querySourceReferenceExpression, nameof(querySourceReferenceExpression)); Check.NotNull(entityType, nameof(entityType)); Check.NotNull(queryCompilationContext, nameof(queryCompilationContext)); QuerySourceReferenceExpression = querySourceReferenceExpression; _entityType = entityType; _queryCompilationContext = queryCompilationContext; _entityKeyFactorySource = entityKeyFactorySource; _clrPropertyGetterSource = clrPropertyGetterSource; _entityKeyProperties = _entityType.GetPrimaryKey().Properties; _entityKeyFactory = _entityKeyFactorySource.GetKeyFactory(_entityType.GetPrimaryKey()); _includedNavigationPaths = _queryCompilationContext .GetTrackableIncludes(querySourceReferenceExpression.ReferencedQuerySource); if (_includedNavigationPaths != null) { _includedEntityTrackingInfos = new Dictionary<INavigation, IncludedEntityTrackingInfo>(); foreach (var navigation in _includedNavigationPaths.SelectMany(ns => ns)) { if (!_includedEntityTrackingInfos.ContainsKey(navigation)) { var targetEntityType = navigation.GetTargetType(); var targetKey = targetEntityType.GetPrimaryKey(); _includedEntityTrackingInfos.Add( navigation, new IncludedEntityTrackingInfo( targetEntityType, _entityKeyFactorySource.GetKeyFactory(targetKey), targetKey.Properties)); } } } }
private object GetTargetEntity( IEntityType targetEntityType, EntityKeyFactory entityKeyFactory, IReadOnlyList<IProperty> keyProperties, EntityLoadInfo entityLoadInfo, ICollection<BufferedEntity> bufferedEntities, bool querySourceRequiresTracking) { var entityKey = entityKeyFactory .Create(targetEntityType, keyProperties, entityLoadInfo.ValueReader); var targetEntity = GetEntity( targetEntityType, entityKey, entityLoadInfo, querySourceRequiresTracking); if (targetEntity != null) { List<BufferedEntity> bufferedTargetEntities; bufferedEntities.Add( _byEntityInstance.TryGetValue(targetEntity, out bufferedTargetEntities) ? bufferedTargetEntities[0] : new BufferedEntity(targetEntityType, entityLoadInfo.ValueReader) { Instance = targetEntity }); } return targetEntity; }