/// <summary>
        /// Construct all the child nodes for the current navigation tree node.
        /// </summary>
        /// <param name="node">The current navigation tree node.</param>
        /// <returns>Returns the current node with all its child nodes.</returns>
        private static NavigateTreeNode Construct(NavigateTreeNode node)
        {
            if (null == node || !node.data.TypeShortName.IsSpecifiedEntityTypeShortNameExist())
            {
                return(node);
            }

            NavigateTreeNode.Path += node.data.Name != "root" ? "/" + node.data.Name + "/" + node.data.TypeFullName : string.Empty;
            var navigationPropertyElems = MetadataHelper.GetNavigProperties(node.data.TypeShortName, NavigateTreeNode.Path);

            foreach (var navigationPropertyElem in navigationPropertyElems)
            {
                if (null != navigationPropertyElem.Item1.Attribute("Name") && null != navigationPropertyElem.Item1.Attribute("Type"))
                {
                    string navigationPropName  = navigationPropertyElem.Item1.GetAttributeValue("Name");
                    string entityTypeFullName  = navigationPropertyElem.Item1.GetAttributeValue("Type").RemoveCollectionFlag();
                    string entityTypeShortName = entityTypeFullName.GetLastSegment();
                    string path         = navigationPropertyElem.Item2;
                    bool   isCollection = navigationPropertyElem.Item1.GetAttributeValue("Type").StartsWith("Collection(");
                    string partner      =
                        null != navigationPropertyElem.Item1.Attribute("Partner") ?
                        navigationPropertyElem.Item1.GetAttributeValue("Partner") :
                        string.Empty;
                    bool containsTarget =
                        null != navigationPropertyElem.Item1.Attribute("ContainsTarget") ?
                        Convert.ToBoolean(navigationPropertyElem.Item1.GetAttributeValue("ContainsTarget")) :
                        false;

                    var data      = new NavigationData(navigationPropName, entityTypeShortName, entityTypeFullName, path, isCollection, partner, containsTarget);
                    var childNode = new NavigateTreeNode(data);
                    childNode.parent = node;
                    if (childNode.data.ContainsTarget && !IsEntityTypeTraverse(entityTypeShortName, node))
                    {
                        node.AddChild(NavigateTreeNode.Construct(childNode));
                    }
                    else
                    {
                        node.AddChild(childNode);
                    }
                }
            }

            return(node);
        }
        /// <summary>
        /// Construct all the child nodes for the current navigation tree node.
        /// </summary>
        /// <param name="node">The current navigation tree node.</param>
        /// <returns>Returns the current node with all its child nodes.</returns>
        private static NavigateTreeNode Construct(NavigateTreeNode node)
        {
            if (null == node || !node.data.TypeShortName.IsSpecifiedEntityTypeShortNameExist())
            {
                return node;
            }

            NavigateTreeNode.Path += node.data.Name != "root" ? "/" + node.data.Name + "/" + node.data.TypeFullName : string.Empty;
            var navigationPropertyElems = MetadataHelper.GetNavigProperties(node.data.TypeShortName, NavigateTreeNode.Path);
            foreach (var navigationPropertyElem in navigationPropertyElems)
            {
                if (null != navigationPropertyElem.Item1.Attribute("Name") && null != navigationPropertyElem.Item1.Attribute("Type"))
                {
                    string navigationPropName = navigationPropertyElem.Item1.GetAttributeValue("Name");
                    string entityTypeFullName = navigationPropertyElem.Item1.GetAttributeValue("Type").RemoveCollectionFlag();
                    string entityTypeShortName = entityTypeFullName.GetLastSegment();
                    string path = navigationPropertyElem.Item2;
                    bool isCollection = navigationPropertyElem.Item1.GetAttributeValue("Type").StartsWith("Collection(");
                    string partner =
                        null != navigationPropertyElem.Item1.Attribute("Partner") ?
                        navigationPropertyElem.Item1.GetAttributeValue("Partner") :
                        string.Empty;
                    bool containsTarget =
                        null != navigationPropertyElem.Item1.Attribute("ContainsTarget") ?
                        Convert.ToBoolean(navigationPropertyElem.Item1.GetAttributeValue("ContainsTarget")) :
                        false;

                    var data = new NavigationData(navigationPropName, entityTypeShortName, entityTypeFullName, path, isCollection, partner, containsTarget);
                    var childNode = new NavigateTreeNode(data);
                    childNode.parent = node;
                    if (childNode.data.ContainsTarget && !IsEntityTypeTraverse(entityTypeShortName, node))
                    {
                        node.AddChild(NavigateTreeNode.Construct(childNode));
                    }
                    else
                    {
                        node.AddChild(childNode);
                    }
                }
            }

            return node;
        }