private EntityGroupTask CreateTask()
        {
            TypeInfo exactReferencedType;
            var      hasExactTypeBeenGotten = PrefetchHelper.TryGetExactKeyType(Key, Manager, out exactReferencedType);

            if (hasExactTypeBeenGotten != null)
            {
                if (hasExactTypeBeenGotten.Value)
                {
                    Type = exactReferencedType;
                    //FillColumnCollection();
                    needToNotifyOwner = false;
                }
                else
                {
                    needToNotifyOwner = true;
                }
            }
            else
            {
                return(null);
            }
            FillColumnCollection();
            if (!SelectColumnsToBeLoaded())
            {
                return(null);
            }
            Task = new EntityGroupTask(Type, ColumnIndexesToBeLoaded.ToArray(), Manager);
            return(Task);
        }
        private void RegisterFetchByKnownForeignKey(PrefetchFieldDescriptor referencingFieldDescriptor,
                                                    EntityState ownerState)
        {
            var association        = referencingFieldDescriptor.Field.Associations.Last();
            var referencedKeyTuple = association
                                     .ExtractForeignKey(ownerState.Type, ownerState.Tuple);
            var referencedKeyTupleState = referencedKeyTuple.GetFieldStateMap(TupleFieldState.Null);

            for (var i = 0; i < referencedKeyTupleState.Length; i++)
            {
                if (referencedKeyTupleState[i])
                {
                    return;
                }
            }
            var session       = Manager.Owner.Session;
            var referencedKey = Key.Create(session.Domain, session.StorageNodeId,
                                           association.TargetType, TypeReferenceAccuracy.BaseType,
                                           referencedKeyTuple);
            var      targetType       = association.TargetType;
            var      areToNotifyOwner = true;
            TypeInfo exactReferencedType;
            var      hasExactTypeBeenGotten = PrefetchHelper.TryGetExactKeyType(referencedKey, Manager,
                                                                                out exactReferencedType);

            if (hasExactTypeBeenGotten != null)
            {
                if (hasExactTypeBeenGotten.Value)
                {
                    targetType       = exactReferencedType;
                    areToNotifyOwner = false;
                }
            }
            else
            {
                return;
            }
            var fieldsToBeLoaded = PrefetchHelper
                                   .GetCachedDescriptorsForFieldsLoadedByDefault(session.Domain, targetType);
            var graphContainer = Manager.SetUpContainers(referencedKey, targetType,
                                                         fieldsToBeLoaded, true, null, true);

            if (areToNotifyOwner)
            {
                graphContainer.RootEntityContainer.SetParametersOfReference(referencingFieldDescriptor, referencedKey);
            }
        }