private static void AddNavigationBindings(NavigationSourceConfiguration configuration, EdmNavigationSource navigationSource, NavigationSourceLinkBuilderAnnotation linkBuilder, ODataModelBuilder builder, Dictionary <Type, IEdmType> edmTypeMap, Dictionary <string, EdmNavigationSource> edmNavigationSourceMap) { foreach (EntityTypeConfiguration entityType in builder.ThisAndBaseAndDerivedTypes(configuration.EntityType)) { foreach (NavigationPropertyConfiguration navigationProperty in entityType.NavigationProperties) { NavigationPropertyBindingConfiguration binding = configuration.FindBinding(navigationProperty); bool isContained = navigationProperty.ContainsTarget; if (binding != null || isContained) { EdmEntityType edmEntityType = edmTypeMap[entityType.ClrType] as EdmEntityType; IEdmNavigationProperty edmNavigationProperty = edmEntityType.NavigationProperties() .Single(np => np.Name == navigationProperty.Name); if (!isContained) { navigationSource.AddNavigationTarget( edmNavigationProperty, edmNavigationSourceMap[binding.TargetNavigationSource.Name]); } NavigationLinkBuilder linkBuilderFunc = configuration.GetNavigationPropertyLink(navigationProperty); if (linkBuilderFunc != null) { linkBuilder.AddNavigationPropertyLinkBuilder(edmNavigationProperty, linkBuilderFunc); } } } } }
private static void AddNavigationBindings(EdmTypeMap edmMap, NavigationSourceConfiguration navigationSourceConfiguration, EdmNavigationSource navigationSource, NavigationSourceLinkBuilderAnnotation linkBuilder, Dictionary <string, EdmNavigationSource> edmNavigationSourceMap) { foreach (var binding in navigationSourceConfiguration.Bindings) { NavigationPropertyConfiguration navigationProperty = binding.NavigationProperty; bool isContained = navigationProperty.ContainsTarget; IEdmType edmType = edmMap.EdmTypes[navigationProperty.DeclaringType.ClrType]; IEdmStructuredType structuraType = edmType as IEdmStructuredType; IEdmNavigationProperty edmNavigationProperty = structuraType.NavigationProperties() .Single(np => np.Name == navigationProperty.Name); string bindingPath = ConvertBindingPath(edmMap, binding); if (!isContained) { // calculate the binding path navigationSource.AddNavigationTarget( edmNavigationProperty, edmNavigationSourceMap[binding.TargetNavigationSource.Name], new EdmPathExpression(bindingPath)); } NavigationLinkBuilder linkBuilderFunc = navigationSourceConfiguration.GetNavigationPropertyLink(navigationProperty); if (linkBuilderFunc != null) { linkBuilder.AddNavigationPropertyLinkBuilder(edmNavigationProperty, linkBuilderFunc); } } }
/// <summary> /// Configures the navigation link for the given navigation properties for this navigation source. /// </summary> /// <param name="navigationProperties">The navigation properties for which the navigation link is being generated.</param> /// <param name="navigationLinkBuilder">The builder used to generate the navigation link.</param> /// <returns>Returns itself so that multiple calls can be chained.</returns> public virtual INavigationSourceConfiguration HasNavigationPropertiesLink( IEnumerable <NavigationPropertyConfiguration> navigationProperties, NavigationLinkBuilder navigationLinkBuilder) { if (navigationProperties == null) { throw Error.ArgumentNull("navigationProperties"); } if (navigationLinkBuilder == null) { throw Error.ArgumentNull("navigationLinkBuilder"); } foreach (NavigationPropertyConfiguration navigationProperty in navigationProperties) { HasNavigationPropertyLink(navigationProperty, navigationLinkBuilder); } return(this); }
/// <summary> /// Configures the navigation link for the given navigation property for this navigation source. /// </summary> /// <param name="navigationProperty">The navigation property for which the navigation link is being generated.</param> /// <param name="navigationLinkBuilder">The builder used to generate the navigation link.</param> /// <returns>Returns itself so that multiple calls can be chained.</returns> public virtual INavigationSourceConfiguration HasNavigationPropertyLink(NavigationPropertyConfiguration navigationProperty, NavigationLinkBuilder navigationLinkBuilder) { if (navigationProperty == null) { throw Error.ArgumentNull("navigationProperty"); } if (navigationLinkBuilder == null) { throw Error.ArgumentNull("navigationLinkBuilder"); } EntityTypeConfiguration declaringEntityType = navigationProperty.DeclaringEntityType; if (!(declaringEntityType.IsAssignableFrom(EntityType) || EntityType.IsAssignableFrom(declaringEntityType))) { throw Error.Argument("navigationProperty", SRResources.NavigationPropertyNotInHierarchy, declaringEntityType.FullName, EntityType.FullName, Name); } _navigationPropertyLinkBuilders[navigationProperty] = navigationLinkBuilder; return(this); }
/// <summary> /// Register a link builder for a <see cref="IEdmNavigationProperty" /> that navigates from Entities in this navigation source. /// </summary> public void AddNavigationPropertyLinkBuilder(IEdmNavigationProperty navigationProperty, NavigationLinkBuilder linkBuilder) { _navigationPropertyLinkBuilderLookup[navigationProperty] = linkBuilder; }
/// <summary> /// Configures the navigation link for the given navigation property for this navigation source. /// </summary> /// <param name="navigationProperty">The navigation property for which the navigation link is being generated.</param> /// <param name="navigationLinkBuilder">The builder used to generate the navigation link.</param> /// <returns>Returns itself so that multiple calls can be chained.</returns> public virtual INavigationSourceConfiguration HasNavigationPropertyLink(NavigationPropertyConfiguration navigationProperty, NavigationLinkBuilder navigationLinkBuilder) { if (navigationProperty == null) { throw Error.ArgumentNull("navigationProperty"); } if (navigationLinkBuilder == null) { throw Error.ArgumentNull("navigationLinkBuilder"); } EntityTypeConfiguration declaringEntityType = navigationProperty.DeclaringEntityType; if (!(declaringEntityType.IsAssignableFrom(EntityType) || EntityType.IsAssignableFrom(declaringEntityType))) { throw Error.Argument("navigationProperty", SRResources.NavigationPropertyNotInHierarchy, declaringEntityType.FullName, EntityType.FullName, Name); } _navigationPropertyLinkBuilders[navigationProperty] = navigationLinkBuilder; return this; }
/// <summary> /// Configures the navigation link for the given navigation properties for this navigation source. /// </summary> /// <param name="navigationProperties">The navigation properties for which the navigation link is being generated.</param> /// <param name="navigationLinkBuilder">The builder used to generate the navigation link.</param> /// <returns>Returns itself so that multiple calls can be chained.</returns> public virtual INavigationSourceConfiguration HasNavigationPropertiesLink( IEnumerable<NavigationPropertyConfiguration> navigationProperties, NavigationLinkBuilder navigationLinkBuilder) { if (navigationProperties == null) { throw Error.ArgumentNull("navigationProperties"); } if (navigationLinkBuilder == null) { throw Error.ArgumentNull("navigationLinkBuilder"); } foreach (NavigationPropertyConfiguration navigationProperty in navigationProperties) { HasNavigationPropertyLink(navigationProperty, navigationLinkBuilder); } return this; }