/// <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 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"); if (!navigationProperty.ContainsTarget && bindingPath != null) { Dictionary <string, IEdmNavigationPropertyBinding> result; IEdmNavigationPropertyBinding binding; if (this.navigationPropertyMappings.TryGetValue(navigationProperty, out result) && result.TryGetValue(bindingPath.Path, out binding)) { return(binding.Target); } } else if (navigationProperty.ContainsTarget) { return(EdmUtil.DictionaryGetOrUpdate( this.containedNavigationPropertyCache, navigationProperty, navProperty => new EdmContainedEntitySet(this, navProperty))); } return(EdmUtil.DictionaryGetOrUpdate( this.unknownNavigationPropertyCache, navigationProperty, navProperty => new EdmUnknownEntitySet(this, navProperty))); }
private IEdmNavigationPropertyBinding AddNavigationPropertyBinding(IEdmNavigationProperty navigationProperty, IEdmNavigationSource target, IEdmPathExpression bindingPath) { Dictionary <string, IEdmNavigationPropertyBinding> mapping = EdmUtil.DictionaryGetOrUpdate( this.navigationPropertyMappings, navigationProperty, navProperty => new Dictionary <string, IEdmNavigationPropertyBinding>()); IEdmNavigationPropertyBinding containedBinding = EdmUtil.DictionaryGetOrUpdate <string, IEdmNavigationPropertyBinding>( mapping, bindingPath.Path, path => new EdmNavigationPropertyBinding(navigationProperty, target, new EdmPathExpression(path))); return(containedBinding); }
private static HashEntry GetHashEntry(IEdmEnumType enumType) { if (fieldInfoHash.Count > MaxHashElements) { lock (fieldInfoHash) { if (fieldInfoHash.Count > MaxHashElements) { fieldInfoHash.Clear(); } } } return(EdmUtil.DictionaryGetOrUpdate(fieldInfoHash, enumType, type => new HashEntry(null, null))); }