/// <summary>
        /// Tracks the AddRelatedObject method.
        /// </summary>
        /// <param name="data">The data service context data on which to apply state transition.</param>
        /// <param name="source">The source.</param>
        /// <param name="sourcePropertyName">Name of the source property.</param>
        /// <param name="target">The target.</param>
        public static void TrackAddRelatedObject(this DataServiceContextData data, object source, string sourcePropertyName, object target)
        {
            CheckEntityIsNotTracked(data, target);

            EntityDescriptorData sourceDescriptorData = GetTrackedEntityDescriptorData(data, source, "Cannot add link:", "source");
            CheckStateIsNot(EntityStates.Deleted, sourceDescriptorData, "Cannot add related object:", "source");

            EntityDescriptorData targetDescriptorData = data.CreateEntityDescriptorData(EntityStates.Added, data.GetNextChangeOrder(), target);

            data.CreateLinkDescriptorData(EntityStates.Added, uint.MaxValue, sourceDescriptorData, sourcePropertyName, targetDescriptorData);

            targetDescriptorData
                .SetParentForInsert(source)
                .SetParentPropertyForInsert(sourcePropertyName);
        }
        /// <summary>
        /// Tracks the AddObject method.
        /// </summary>
        /// <param name="data">The data service context data on which to apply state transition.</param>
        /// <param name="entitySetName">Name of the entity set.</param>
        /// <param name="entity">The entity.</param>
        public static void TrackAddObject(this DataServiceContextData data, string entitySetName, object entity)
        {
            CheckEntitySetName(ref entitySetName);
            CheckEntityIsNotTracked(data, entity);

            var entityDescriptorData = data.CreateEntityDescriptorData(EntityStates.Added, data.GetNextChangeOrder(), entity)
                .SetEntitySetName(entitySetName);

            if (data.ResolveEntitySet != null)
            {
                entityDescriptorData.InsertLink = data.ResolveEntitySet(entitySetName);
            }
            else
            {
                entityDescriptorData.InsertLink = new Uri(UriHelpers.ConcatenateUriSegments(data.BaseUri.OriginalString, entitySetName));
            }
        }
        /// <summary>
        /// Tracks the AttachTo method.
        /// </summary>
        /// <param name="data">The data service context data on which to apply state transition.</param>
        /// <param name="entitySetName">Name of the entity set.</param>
        /// <param name="entity">The entity.</param>
        /// <param name="identity">The identity.</param>
        /// <param name="entityETag">The etag for the entity.</param>
        /// <param name="editLink">The edit link for the entity</param>
        public static void TrackAttachTo(this DataServiceContextData data, string entitySetName, object entity, Uri identity, string entityETag, Uri editLink)
        {
            CheckEntitySetName(ref entitySetName);
            CheckEntityIsNotTracked(data, entity);
            CheckIdentity(data, identity);

            data.CreateEntityDescriptorData(EntityStates.Unchanged, data.GetNextChangeOrder(), entity)
                .SetEntitySetName(entitySetName)
                .SetETag(entityETag)
                .SetIdentity(identity)
                .SetEditLink(editLink);
        }