/// <summary>
        /// Finds the navigation source that a navigation property targets.
        /// </summary>
        /// <param name="navigationProperty">The navigation property.</param>
        /// <param name="bindingPath">The binding path of the navigation property.</param>
        /// <returns>The navigation source that the navigation property targets</returns>
        public virtual IEdmNavigationSource FindNavigationTarget(IEdmNavigationProperty navigationProperty, IEdmPathExpression bindingPath)
        {
            EdmUtil.CheckArgumentNull(navigationProperty, "navigationProperty");

            bindingPath = bindingPath ?? new EdmPathExpression(navigationProperty.Name);

            Dictionary <string, IEdmNavigationPropertyBinding> result = EdmUtil.DictionarySafeGet(this.navigationPropertyMappings, navigationProperty);

            if (result != null)
            {
                IEdmNavigationPropertyBinding binding = EdmUtil.DictionarySafeGet(result, bindingPath.Path);
                {
                    if (binding != null)
                    {
                        return(binding.Target);
                    }
                }
            }

            if (navigationProperty.ContainsTarget)
            {
                return(AddNavigationPropertyBinding(
                           navigationProperty,
                           new EdmContainedEntitySet(this, navigationProperty, bindingPath),
                           bindingPath)
                       .Target);
            }

            return(EdmUtil.DictionaryGetOrUpdate(
                       this.unknownNavigationPropertyCache,
                       navigationProperty,
                       navProperty => new EdmUnknownEntitySet(this, navProperty)));
        }
        /// <summary>
        /// Finds the bindings of the navigation property.
        /// </summary>
        /// <param name="navigationProperty">The navigation property.</param>
        /// <returns>The list of bindings for current navigation property.</returns>
        public virtual IEnumerable <IEdmNavigationPropertyBinding> FindNavigationPropertyBindings(IEdmNavigationProperty navigationProperty)
        {
            EdmUtil.CheckArgumentNull(navigationProperty, "navigationProperty");

            Dictionary <string, IEdmNavigationPropertyBinding> result =
                EdmUtil.DictionarySafeGet(this.navigationPropertyMappings, navigationProperty);

            if (result != null)
            {
                return(result.Select(item => item.Value));
            }

            return(null);
        }