private static IEdmTypeReference AddPrecisionConfigInPrimitiveTypeReference( PrecisionPropertyConfiguration precisionProperty, IEdmTypeReference primitiveTypeReference) { if (primitiveTypeReference is EdmTemporalTypeReference && precisionProperty.Precision.HasValue) { return(new EdmTemporalTypeReference( (IEdmPrimitiveType)primitiveTypeReference.Definition, primitiveTypeReference.IsNullable, precisionProperty.Precision)); } return(primitiveTypeReference); }
/// <summary> /// Adds a primitive property to this edm type. /// </summary> /// <param name="propertyInfo">The property being added.</param> /// <returns>The <see cref="PrimitivePropertyConfiguration"/> so that the property can be configured further.</returns> public virtual PrimitivePropertyConfiguration AddProperty(PropertyInfo propertyInfo) { if (propertyInfo == null) { throw Error.ArgumentNull("propertyInfo"); } if (!propertyInfo.ReflectedType.IsAssignableFrom(this.ClrType)) { throw Error.Argument("propertyInfo", SRResources.PropertyDoesNotBelongToType, propertyInfo.Name, this.ClrType.FullName); } this.ValidatePropertyNotAlreadyDefinedInBaseTypes(propertyInfo); this.ValidatePropertyNotAlreadyDefinedInDerivedTypes(propertyInfo); // Remove from the ignored properties if (this.RemovedProperties.Any(prop => prop.Name.Equals(propertyInfo.Name))) { this.RemovedProperties.Remove(this.RemovedProperties.First(prop => prop.Name.Equals(propertyInfo.Name))); } PrimitivePropertyConfiguration propertyConfiguration = this.ValidatePropertyNotAlreadyDefinedOtherTypes <PrimitivePropertyConfiguration>(propertyInfo, SRResources.MustBePrimitiveProperty); if (propertyConfiguration == null) { propertyConfiguration = new PrimitivePropertyConfiguration(propertyInfo, this); var primitiveType = EdmLibHelpers.GetEdmPrimitiveTypeOrNull(propertyInfo.PropertyType); if (primitiveType != null) { if (primitiveType.PrimitiveKind == EdmPrimitiveTypeKind.Decimal) { propertyConfiguration = new DecimalPropertyConfiguration(propertyInfo, this); } else if (EdmLibHelpers.HasLength(primitiveType.PrimitiveKind)) { propertyConfiguration = new LengthPropertyConfiguration(propertyInfo, this); } else if (EdmLibHelpers.HasPrecision(primitiveType.PrimitiveKind)) { propertyConfiguration = new PrecisionPropertyConfiguration(propertyInfo, this); } } this.ExplicitProperties[propertyInfo] = propertyConfiguration; } return(propertyConfiguration); }
private void CreateStructuralTypeBody(EdmStructuredType type, StructuralTypeConfiguration config) { foreach (PropertyConfiguration property in config.Properties) { IEdmProperty edmProperty = null; switch (property.Kind) { case PropertyKind.Primitive: PrimitivePropertyConfiguration primitiveProperty = (PrimitivePropertyConfiguration)property; EdmPrimitiveTypeKind typeKind = primitiveProperty.TargetEdmTypeKind ?? GetTypeKind(primitiveProperty.PropertyInfo.PropertyType); IEdmTypeReference primitiveTypeReference = EdmCoreModel.Instance.GetPrimitive( typeKind, primitiveProperty.OptionalProperty); if (typeKind == EdmPrimitiveTypeKind.Decimal) { DecimalPropertyConfiguration decimalProperty = primitiveProperty as DecimalPropertyConfiguration; if (decimalProperty.Precision.HasValue || decimalProperty.Scale.HasValue) { primitiveTypeReference = new EdmDecimalTypeReference( (IEdmPrimitiveType)primitiveTypeReference.Definition, primitiveTypeReference.IsNullable, decimalProperty.Precision, decimalProperty.Scale.HasValue ? decimalProperty.Scale : 0); } } else if (EdmLibHelpers.HasPrecision(typeKind)) { PrecisionPropertyConfiguration precisionProperty = primitiveProperty as PrecisionPropertyConfiguration; primitiveTypeReference = AddPrecisionConfigInPrimitiveTypeReference( precisionProperty, primitiveTypeReference); } else if (EdmLibHelpers.HasLength(typeKind)) { LengthPropertyConfiguration lengthProperty = primitiveProperty as LengthPropertyConfiguration; primitiveTypeReference = AddLengthConfigInPrimitiveTypeReference( lengthProperty, primitiveTypeReference); } edmProperty = type.AddStructuralProperty( primitiveProperty.Name, primitiveTypeReference, defaultValue: null); break; case PropertyKind.Complex: ComplexPropertyConfiguration complexProperty = property as ComplexPropertyConfiguration; IEdmComplexType complexType = this.GetEdmType(complexProperty.RelatedClrType) as IEdmComplexType; edmProperty = type.AddStructuralProperty( complexProperty.Name, new EdmComplexTypeReference(complexType, complexProperty.OptionalProperty)); break; case PropertyKind.Collection: edmProperty = this.CreateStructuralTypeCollectionPropertyBody(type, (CollectionPropertyConfiguration)property); break; case PropertyKind.Enum: edmProperty = this.CreateStructuralTypeEnumPropertyBody(type, (EnumPropertyConfiguration)property); break; default: break; } if (edmProperty != null) { if (property.PropertyInfo != null) { this._properties[property.PropertyInfo] = edmProperty; } if (property.IsRestricted) { this._propertiesRestrictions[edmProperty] = new QueryableRestrictions(property); } if (property.QueryConfiguration.ModelBoundQuerySettings != null) { this._propertiesQuerySettings.Add(edmProperty, property.QueryConfiguration.ModelBoundQuerySettings); } } } }