private static void AddOptimisticConcurrencyAnnotation(this EdmModel model, IEdmVocabularyAnnotatable target, NavigationSourceConfiguration navigationSourceConfiguration, EdmTypeMap edmTypeMap) { EntityTypeConfiguration entityTypeConfig = navigationSourceConfiguration.EntityType; IEnumerable <StructuralPropertyConfiguration> concurrencyPropertyies = entityTypeConfig.Properties.OfType <StructuralPropertyConfiguration>().Where(property => property.ConcurrencyToken); IList <IEdmStructuralProperty> edmProperties = new List <IEdmStructuralProperty>(); foreach (StructuralPropertyConfiguration property in concurrencyPropertyies) { IEdmProperty value; if (edmTypeMap.EdmProperties.TryGetValue(property.PropertyInfo, out value)) { var item = value as IEdmStructuralProperty; if (item != null) { edmProperties.Add(item); } } } if (edmProperties.Any()) { IEdmCollectionExpression collectionExpression = new EdmCollectionExpression(edmProperties.Select(p => new EdmPropertyPathExpression(p.Name)).ToArray()); IEdmTerm term = Microsoft.OData.Edm.Vocabularies.V1.CoreVocabularyModel.ConcurrencyTerm; EdmVocabularyAnnotation annotation = new EdmVocabularyAnnotation(target, term, collectionExpression); annotation.SetSerializationLocation(model, EdmVocabularyAnnotationSerializationLocation.Inline); model.SetVocabularyAnnotation(annotation); } }
public NavigationPropertyBindingConfiguration HasOptionalBinding<TTargetType, TDerivedType>( Expression<Func<TDerivedType, TTargetType>> navigationExpression, string targetEntitySet) where TTargetType : class where TDerivedType : class, TStructuralType { if (navigationExpression == null) { throw Error.ArgumentNull("navigationExpression"); } if (String.IsNullOrEmpty(targetEntitySet)) { throw Error.ArgumentNullOrEmpty("targetEntitySet"); } StructuralTypeConfiguration<TDerivedType> derivedConfiguration; if (this._structuralType.Configuration.Kind == EdmTypeKind.Entity) { derivedConfiguration = this._modelBuilder.EntityType<TDerivedType>().DerivesFrom<TStructuralType>(); } else { derivedConfiguration = this._modelBuilder.ComplexType<TDerivedType>().DerivesFrom<TStructuralType>(); } NavigationPropertyConfiguration navigation = derivedConfiguration.HasOptional(navigationExpression); IList<MemberInfo> bindingPath = new List<MemberInfo>(this._bindingPath); bindingPath.Add(typeof(TDerivedType)); bindingPath.Add(navigation.PropertyInfo); NavigationSourceConfiguration entitySet = this._modelBuilder.EntitySet<TTargetType>(targetEntitySet).Configuration; return this._navigationSource.AddBinding(navigation, entitySet, bindingPath); }
/// <summary> /// Initializes a new instance of the <see cref="BindingPathConfiguration{TStructuralType}"/> class. /// </summary> /// <param name="modelBuilder">The model builder.</param> /// <param name="structuralType">The type configuration.</param> /// <param name="navigationSource">The navigation source configuration.</param> /// <param name="bindingPath">The binding path.</param> public BindingPathConfiguration(ODataModelBuilder modelBuilder, StructuralTypeConfiguration<TStructuralType> structuralType, NavigationSourceConfiguration navigationSource, IList<MemberInfo> bindingPath) { if (modelBuilder == null) { throw Error.ArgumentNull("modelBuilder"); } if (structuralType == null) { throw Error.ArgumentNull("structuralType"); } if (navigationSource == null) { throw Error.ArgumentNull("navigationSource"); } if (bindingPath == null) { throw Error.ArgumentNull("bindingPath"); } this._modelBuilder = modelBuilder; this._navigationSource = navigationSource; this._structuralType = structuralType; this._bindingPath = bindingPath; }
public NavigationPropertyBindingConfiguration HasSingletonBinding <TTargetType, TDerivedEntityType>( Expression <Func <TDerivedEntityType, TTargetType> > navigationExpression, NavigationSourceConfiguration <TTargetType> targetSingleton) where TTargetType : class where TDerivedEntityType : class, TEntityType { if (navigationExpression == null) { throw Error.ArgumentNull("navigationExpression"); } if (targetSingleton == null) { throw Error.ArgumentNull("targetSingleton"); } EntityTypeConfiguration <TDerivedEntityType> derivedEntityType = this._modelBuilder.EntityType <TDerivedEntityType>().DerivesFrom <TEntityType>(); NavigationPropertyConfiguration navigation = derivedEntityType.HasRequired(navigationExpression); IList <MemberInfo> bindingPath = new List <MemberInfo> { typeof(TDerivedEntityType), navigation.PropertyInfo }; return(this.Configuration.AddBinding(navigation, targetSingleton.Configuration, bindingPath)); }
private static void AddCoreVocabularyAnnotations(this EdmModel model, IEnumerable <NavigationSourceAndAnnotations> navigationSources, EdmTypeMap edmTypeMap) { Contract.Assert(model != null); Contract.Assert(edmTypeMap != null); if (navigationSources == null) { return; } foreach (NavigationSourceAndAnnotations source in navigationSources) { IEdmVocabularyAnnotatable navigationSource = source.NavigationSource as IEdmVocabularyAnnotatable; if (navigationSource == null) { continue; } NavigationSourceConfiguration navigationSourceConfig = source.Configuration as NavigationSourceConfiguration; if (navigationSourceConfig == null) { continue; } model.AddOptimisticConcurrencyAnnotation(navigationSource, navigationSourceConfig, edmTypeMap); } }
private static void AddNavigationBindings(EdmTypeMap edmMap, NavigationSourceConfiguration navigationSourceConfiguration, EdmNavigationSource navigationSource, 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)); } } }
/// <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); }
public NavigationPropertyBindingConfiguration HasSingletonBinding <TTargetType>( Expression <Func <TEntityType, TTargetType> > navigationExpression, NavigationSourceConfiguration <TTargetType> targetSingleton) where TTargetType : class { if (navigationExpression == null) { throw Error.ArgumentNull("navigationExpression"); } if (targetSingleton == null) { throw Error.ArgumentNull("targetSingleton"); } return(this.Configuration.AddBinding(this.EntityType.HasRequired(navigationExpression), targetSingleton.Configuration)); }
public NavigationPropertyBindingConfiguration HasManyBinding <TTargetType>( Expression <Func <TEntityType, IEnumerable <TTargetType> > > navigationExpression, NavigationSourceConfiguration <TTargetType> targetEntitySet) where TTargetType : class { if (navigationExpression == null) { throw Error.ArgumentNull("navigationExpression"); } if (targetEntitySet == null) { throw Error.ArgumentNull("targetEntitySet"); } return(this.Configuration.AddBinding(this.EntityType.HasMany(navigationExpression), targetEntitySet.Configuration)); }
internal NavigationSourceConfiguration(ODataModelBuilder modelBuilder, NavigationSourceConfiguration configuration) { if (modelBuilder == null) { throw Error.ArgumentNull("modelBuilder"); } if (configuration == null) { throw Error.ArgumentNull("configuration"); } this._configuration = configuration; this._modelBuilder = modelBuilder; this._entityType = new EntityTypeConfiguration <TEntityType>(modelBuilder, this._configuration.EntityType); this._binding = new BindingPathConfiguration <TEntityType>(modelBuilder, this._entityType, this._configuration); }
/// <summary> /// Initializes a new instance of the <see cref="NavigationPropertyBindingConfiguration"/> class. /// </summary> /// <param name="navigationProperty">The navigation property for the binding.</param> /// <param name="navigationSource">The target navigation source of the binding.</param> /// <param name="path">The path of current binding.</param> public NavigationPropertyBindingConfiguration(NavigationPropertyConfiguration navigationProperty, NavigationSourceConfiguration navigationSource, IList <MemberInfo> path) { if (navigationProperty == null) { throw new ArgumentNullException("navigationProperty"); } if (navigationSource == null) { throw new ArgumentNullException("navigationSource"); } if (path == null) { throw new ArgumentNullException("path"); } this.NavigationProperty = navigationProperty; this.TargetNavigationSource = navigationSource; this.Path = path; }
public NavigationPropertyBindingConfiguration HasOptionalBinding<TTargetType>( Expression<Func<TStructuralType, TTargetType>> navigationExpression, string targetEntitySet) where TTargetType : class { if (navigationExpression == null) { throw Error.ArgumentNull("navigationExpression"); } if (String.IsNullOrEmpty(targetEntitySet)) { throw Error.ArgumentNullOrEmpty("targetEntitySet"); } NavigationPropertyConfiguration navigation = this._structuralType.HasOptional(navigationExpression); IList<MemberInfo> bindingPath = new List<MemberInfo>(this._bindingPath); bindingPath.Add(navigation.PropertyInfo); NavigationSourceConfiguration entitySet = this._modelBuilder.EntitySet<TTargetType>(targetEntitySet).Configuration; return this._navigationSource.AddBinding(navigation, entitySet, bindingPath); }
/// <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> /// <returns>The <see cref="NavigationPropertyBindingConfiguration"/> so that it can be further configured.</returns> public virtual NavigationPropertyBindingConfiguration AddBinding(NavigationPropertyConfiguration navigationConfiguration, NavigationSourceConfiguration targetNavigationSource) { if (navigationConfiguration == null) { throw Error.ArgumentNull("navigationConfiguration"); } if (targetNavigationSource == null) { throw Error.ArgumentNull("targetNavigationSource"); } IList <MemberInfo> bindingPath = new List <MemberInfo> { navigationConfiguration.PropertyInfo }; if (navigationConfiguration.DeclaringType != this.EntityType) { bindingPath.Insert(0, navigationConfiguration.DeclaringType.ClrType); } return(this.AddBinding(navigationConfiguration, targetNavigationSource, bindingPath)); }
/// <summary> /// Initializes a new instance of the <see cref="NavigationPropertyBindingConfiguration"/> class. /// </summary> /// <param name="navigationProperty">The navigation property for the binding.</param> /// <param name="navigationSource">The target navigation source of the binding.</param> public NavigationPropertyBindingConfiguration(NavigationPropertyConfiguration navigationProperty, NavigationSourceConfiguration navigationSource) : this(navigationProperty, navigationSource, new MemberInfo[] { navigationProperty.PropertyInfo }) { }
/// <summary> /// Initializes a new instance of the <see cref="BindingPathConfiguration{TStructuralType}"/> class. /// </summary> /// <param name="modelBuilder">The model builder.</param> /// <param name="structuralType">The type configuration.</param> /// <param name="navigationSource">The navigation source configuration.</param> public BindingPathConfiguration(ODataModelBuilder modelBuilder, StructuralTypeConfiguration<TStructuralType> structuralType, NavigationSourceConfiguration navigationSource) : this(modelBuilder, structuralType, navigationSource, new List<MemberInfo>()) { }