/// <summary> /// Binds the given navigation property to the target navigation source. /// </summary> /// <param name="navigationConfiguration">The navigation property.</param> /// <param name="targetNavigationSource">The target navigation source.</param> /// <param name="bindingPath">The binding path.</param> /// <returns>The <see cref="NavigationPropertyBindingConfiguration"/> so that it can be further configured.</returns> public virtual NavigationPropertyBindingConfiguration AddBinding(NavigationPropertyConfiguration navigationConfiguration, NavigationSourceConfiguration targetNavigationSource, IList <MemberInfo> bindingPath) { if (navigationConfiguration == null) { throw Error.ArgumentNull("navigationConfiguration"); } if (targetNavigationSource == null) { throw Error.ArgumentNull("targetNavigationSource"); } if (bindingPath == null || !bindingPath.Any()) { throw Error.ArgumentNull("bindingPath"); } this.VerifyBindingPath(navigationConfiguration, bindingPath); string path = bindingPath.ConvertBindingPath(); Dictionary <string, NavigationPropertyBindingConfiguration> navigationPropertyBindingMap; NavigationPropertyBindingConfiguration navigationPropertyBinding; if (this._navigationPropertyBindings.TryGetValue(navigationConfiguration, out navigationPropertyBindingMap)) { if (navigationPropertyBindingMap.TryGetValue(path, out navigationPropertyBinding)) { if (navigationPropertyBinding.TargetNavigationSource != targetNavigationSource) { throw Error.NotSupported(SRResources.RebindingNotSupported); } } else { navigationPropertyBinding = new NavigationPropertyBindingConfiguration(navigationConfiguration, targetNavigationSource, bindingPath); this._navigationPropertyBindings[navigationConfiguration][path] = navigationPropertyBinding; } } else { this._navigationPropertyBindings[navigationConfiguration] = new Dictionary <string, NavigationPropertyBindingConfiguration>(); navigationPropertyBinding = new NavigationPropertyBindingConfiguration(navigationConfiguration, targetNavigationSource, bindingPath); this._navigationPropertyBindings[navigationConfiguration][path] = navigationPropertyBinding; } return(navigationPropertyBinding); }
private static string ConvertBindingPath(EdmTypeMap edmMap, NavigationPropertyBindingConfiguration binding) { IList <string> bindings = new List <string>(); foreach (var bindingInfo in binding.Path) { Type typeCast = bindingInfo as Type; PropertyInfo propertyInfo = bindingInfo as PropertyInfo; if (typeCast != null) { IEdmType edmType = edmMap.EdmTypes[typeCast]; bindings.Add(edmType.FullTypeName()); } else if (propertyInfo != null) { bindings.Add(edmMap.EdmProperties[propertyInfo].Name); } } return(String.Join("/", bindings)); }