public void RegisterEntitySetTask(EntityState ownerState, PrefetchFieldDescriptor referencingFieldDescriptor)
        {
            if (entitySetTasks == null)
            {
                entitySetTasks = new Dictionary <FieldInfo, EntitySetTask>();
            }
            if (RootEntityContainer == null)
            {
                AddEntityColumns(Key.TypeReference.Type.Fields
                                 .Where(field => field.IsPrimaryKey || field.IsSystem).SelectMany(field => field.Columns));
            }
            EntitySetTask task;

            if (!entitySetTasks.TryGetValue(referencingFieldDescriptor.Field, out task))
            {
                entitySetTasks.Add(referencingFieldDescriptor.Field,
                                   new EntitySetTask(Key, referencingFieldDescriptor, ownerState != null, Manager));
            }
            else if (task.ItemCountLimit == null)
            {
                return;
            }
            else if (referencingFieldDescriptor.EntitySetItemCountLimit == null ||
                     task.ItemCountLimit < referencingFieldDescriptor.EntitySetItemCountLimit)
            {
                entitySetTasks[referencingFieldDescriptor.Field] =
                    new EntitySetTask(Key, referencingFieldDescriptor, ownerState != null, Manager);
            }
        }
 private void RegisterFetchByUnknownForeignKey(PrefetchFieldDescriptor referencingFieldDescriptor)
 {
     if (referencedEntityContainers == null)
     {
         referencedEntityContainers = new Dictionary <FieldInfo, ReferencedEntityContainer>();
     }
     referencedEntityContainers.Add(referencingFieldDescriptor.Field, new ReferencedEntityContainer(Key,
                                                                                                    referencingFieldDescriptor, exactType, Manager));
 }
        // Constructors

        public ReferencedEntityContainer(Key ownerKey, PrefetchFieldDescriptor referencingFieldDescriptor,
                                         bool isOwnerTypeKnown, PrefetchManager manager)
            : base(null, referencingFieldDescriptor.Field.Associations.Last().TargetType, true, manager)
        {
            ArgumentValidator.EnsureArgumentNotNull(referencingFieldDescriptor, "referencingFieldDescriptor");
            ArgumentValidator.EnsureArgumentNotNull(ownerKey, "ownerKey");
            this.ownerKey = ownerKey;
            this.referencingFieldDescriptor = referencingFieldDescriptor;
            this.isOwnerTypeKnown           = isOwnerTypeKnown;
        }
        // Constructors

        public EntitySetTask(Key ownerKey, PrefetchFieldDescriptor referencingFieldDescriptor, bool isOwnerCached,
                             PrefetchManager manager)
        {
            ArgumentValidator.EnsureArgumentNotNull(ownerKey, "ownerKey");
            ArgumentValidator.EnsureArgumentNotNull(referencingFieldDescriptor, "referencingFieldDescriptor");
            ArgumentValidator.EnsureArgumentNotNull(manager, "processor");

            this.ownerKey = ownerKey;
            this.referencingFieldDescriptor = referencingFieldDescriptor;
            this.isOwnerCached = isOwnerCached;
            ItemCountLimit     = referencingFieldDescriptor.EntitySetItemCountLimit;
            this.manager       = manager;
            cacheKey           = new CacheKey(ReferencingField, ItemCountLimit);
        }
        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);
            }
        }
 public void RegisterReferencedEntityContainer(
     EntityState ownerState, PrefetchFieldDescriptor referencingFieldDescriptor)
 {
     if (referencedEntityContainers != null &&
         referencedEntityContainers.ContainsKey(referencingFieldDescriptor.Field))
     {
         return;
     }
     if (!AreAllForeignKeyColumnsLoaded(ownerState, referencingFieldDescriptor.Field))
     {
         RegisterFetchByUnknownForeignKey(referencingFieldDescriptor);
     }
     else
     {
         RegisterFetchByKnownForeignKey(referencingFieldDescriptor, ownerState);
     }
 }
 /// <inheritdoc/>
 public bool Equals(PrefetchFieldDescriptor other)
 {
     return(Equals(other.Field, Field));
 }
 public void SetParametersOfReference(PrefetchFieldDescriptor referencingField, Key key)
 {
     referencingFieldDescriptor = referencingField;
     ownerKey = key;
 }