/// <summary> /// Removes the given property. /// </summary> /// <param name="propertyInfo">The property being removed.</param> public virtual void RemoveProperty(PropertyInfo propertyInfo) { if (propertyInfo == null) { throw Error.ArgumentNull("propertyInfo"); } if (!propertyInfo.DeclaringType.IsAssignableFrom(ClrType)) { throw Error.Argument("propertyInfo", SRResources.PropertyDoesNotBelongToType, propertyInfo.Name, ClrType.FullName); } if (propertyInfo.Name == "Roles") { } (ModelBuilder as ODataConventionModelBuilder) .AddPropertyInternal( (EntityTypeConfiguration)ModelBuilder.GetTypeConfigurationOrNull(ClrType), propertyInfo); if (ExplicitProperties.ContainsKey(propertyInfo)) { ExplicitProperties[propertyInfo].Ignored(true); } //.AddPrAddProperty(propertyInfo).Ignored(true); if (Equals(_dynamicPropertyDictionary, propertyInfo)) { _dynamicPropertyDictionary = null; } }
/// <summary> /// Removes the given property. /// </summary> /// <param name="propertyInfo">The property being removed.</param> public virtual void RemoveProperty(PropertyInfo propertyInfo) { if (propertyInfo == null) { throw Error.ArgumentNull("propertyInfo"); } if (!propertyInfo.ReflectedType.IsAssignableFrom(ClrType)) { throw Error.Argument("propertyInfo", SRResources.PropertyDoesNotBelongToType, propertyInfo.Name, ClrType.FullName); } if (ExplicitProperties.ContainsKey(propertyInfo)) { ExplicitProperties.Remove(propertyInfo); } if (!RemovedProperties.Contains(propertyInfo)) { RemovedProperties.Add(propertyInfo); } if (_dynamicPropertyDictionary == propertyInfo) { _dynamicPropertyDictionary = null; } }
private NavigationPropertyConfiguration AddNavigationProperty(PropertyInfo navigationProperty, EdmMultiplicity multiplicity, bool containsTarget) { if (navigationProperty == null) { throw Error.ArgumentNull("navigationProperty"); } if (!navigationProperty.ReflectedType.IsAssignableFrom(ClrType)) { throw Error.Argument("navigationProperty", SRResources.PropertyDoesNotBelongToType, navigationProperty.Name, ClrType.FullName); } if (navigationProperty.PropertyType == typeof(IEnumerable <DateTime>) || navigationProperty.PropertyType == typeof(IEnumerable <DateTime?>) || navigationProperty.PropertyType == typeof(DateTime) || navigationProperty.PropertyType == typeof(DateTime?)) { throw Error.Argument("navigationProperty", SRResources.DateTimeTypePropertyNotSupported, navigationProperty.PropertyType.FullName, navigationProperty.Name, navigationProperty.DeclaringType.FullName, typeof(DateTimeOffset).FullName, typeof(ODataModelBuilder).FullName); } ValidatePropertyNotAlreadyDefinedInBaseTypes(navigationProperty); ValidatePropertyNotAlreadyDefinedInDerivedTypes(navigationProperty); PropertyConfiguration propertyConfig; NavigationPropertyConfiguration navigationPropertyConfig; if (ExplicitProperties.ContainsKey(navigationProperty)) { propertyConfig = ExplicitProperties[navigationProperty]; if (propertyConfig.Kind != PropertyKind.Navigation) { throw Error.Argument("navigationProperty", SRResources.MustBeNavigationProperty, navigationProperty.Name, ClrType.FullName); } navigationPropertyConfig = propertyConfig as NavigationPropertyConfiguration; if (navigationPropertyConfig.Multiplicity != multiplicity) { throw Error.Argument("navigationProperty", SRResources.MustHaveMatchingMultiplicity, navigationProperty.Name, multiplicity); } } else { navigationPropertyConfig = new NavigationPropertyConfiguration( navigationProperty, multiplicity, this); if (containsTarget) { navigationPropertyConfig = navigationPropertyConfig.Contained(); } ExplicitProperties[navigationProperty] = navigationPropertyConfig; // make sure the related type is configured ModelBuilder.AddEntityType(navigationPropertyConfig.RelatedClrType); } return(navigationPropertyConfig); }
/// <summary> /// Adds a collection property to this edm type. /// </summary> /// <param name="propertyInfo">The property being added.</param> /// <returns>The <see cref="CollectionPropertyConfiguration"/> so that the property can be configured further.</returns> public virtual CollectionPropertyConfiguration AddCollectionProperty(PropertyInfo propertyInfo) { if (propertyInfo == null) { throw Error.ArgumentNull("propertyInfo"); } if (!propertyInfo.DeclaringType.IsAssignableFrom(ClrType)) { throw Error.Argument("propertyInfo", SRResources.PropertyDoesNotBelongToType); } ValidatePropertyNotAlreadyDefinedInBaseTypes(propertyInfo); ValidatePropertyNotAlreadyDefinedInDerivedTypes(propertyInfo); // Remove from the ignored properties if (IgnoredProperties.Contains(propertyInfo)) { RemovedProperties.Remove(propertyInfo); } CollectionPropertyConfiguration propertyConfiguration; if (ExplicitProperties.ContainsKey(propertyInfo)) { propertyConfiguration = ExplicitProperties[propertyInfo] as CollectionPropertyConfiguration; if (propertyConfiguration == null) { throw Error.Argument("propertyInfo", SRResources.MustBeCollectionProperty, propertyInfo.Name, propertyInfo.DeclaringType.FullName); } } else { propertyConfiguration = new CollectionPropertyConfiguration(propertyInfo, this); ExplicitProperties[propertyInfo] = propertyConfiguration; // If the ElementType is the same as this type this is recursive complex type nesting if (propertyConfiguration.ElementType == ClrType) { throw Error.Argument("propertyInfo", SRResources.RecursiveComplexTypesNotAllowed, ClrType.Name, propertyConfiguration.Name); } // If the ElementType is not primitive or enum treat as a ComplexType and Add to the model. IEdmPrimitiveTypeReference edmType = EdmLibHelpers.GetEdmPrimitiveTypeReferenceOrNull(propertyConfiguration.ElementType); if (edmType == null) { if (!TypeHelper.IsEnum(propertyConfiguration.ElementType)) { ModelBuilder.AddComplexType(propertyConfiguration.ElementType); } } } return(propertyConfiguration); }
public virtual ComplexPropertyConfiguration AddComplexProperty(PropertyInfo propertyInfo) { if (propertyInfo == null) { throw Error.ArgumentNull("propertyInfo"); } if (!propertyInfo.ReflectedType.IsAssignableFrom(ClrType)) { throw Error.Argument("propertyInfo", SRResources.PropertyDoesNotBelongToType, propertyInfo.Name, ClrType.FullName); } if (propertyInfo.PropertyType == ClrType) { throw Error.Argument("propertyInfo", SRResources.RecursiveComplexTypesNotAllowed, ClrType.FullName, propertyInfo.Name); } if (propertyInfo.PropertyType == typeof(DateTime) || propertyInfo.PropertyType == typeof(DateTime?)) { throw Error.Argument("propertyInfo", SRResources.DateTimeTypePropertyNotSupported, propertyInfo.PropertyType.FullName, propertyInfo.Name, propertyInfo.DeclaringType.FullName, typeof(DateTimeOffset).FullName, typeof(ODataModelBuilder).FullName); } ValidatePropertyNotAlreadyDefinedInBaseTypes(propertyInfo); ValidatePropertyNotAlreadyDefinedInDerivedTypes(propertyInfo); // Remove from the ignored properties if (RemovedProperties.Contains(propertyInfo)) { RemovedProperties.Remove(propertyInfo); } ComplexPropertyConfiguration propertyConfiguration = null; if (ExplicitProperties.ContainsKey(propertyInfo)) { propertyConfiguration = ExplicitProperties[propertyInfo] as ComplexPropertyConfiguration; if (propertyConfiguration == null) { throw Error.Argument("propertyInfo", SRResources.MustBeComplexProperty, propertyInfo.Name, ClrType.FullName); } } else { propertyConfiguration = new ComplexPropertyConfiguration(propertyInfo, this); ExplicitProperties[propertyInfo] = propertyConfiguration; // Make sure the complex type is in the model. ModelBuilder.AddComplexType(propertyInfo.PropertyType); } return propertyConfiguration; }
/// <summary> /// Adds an enum property to this edm type. /// </summary> /// <param name="propertyInfo">The property being added.</param> /// <returns>The <see cref="EnumPropertyConfiguration"/> so that the property can be configured further.</returns> public virtual EnumPropertyConfiguration AddEnumProperty(PropertyInfo propertyInfo) { if (propertyInfo == null) { throw Error.ArgumentNull("propertyInfo"); } if (!propertyInfo.ReflectedType.IsAssignableFrom(ClrType)) { throw Error.Argument("propertyInfo", SRResources.PropertyDoesNotBelongToType, propertyInfo.Name, ClrType.FullName); } if (!TypeHelper.IsEnum(propertyInfo.PropertyType)) { throw Error.Argument("propertyInfo", SRResources.MustBeEnumProperty, propertyInfo.Name, ClrType.FullName); } ValidatePropertyNotAlreadyDefinedInBaseTypes(propertyInfo); ValidatePropertyNotAlreadyDefinedInDerivedTypes(propertyInfo); // Remove from the ignored properties if (RemovedProperties.Contains(propertyInfo)) { RemovedProperties.Remove(propertyInfo); } EnumPropertyConfiguration propertyConfiguration; if (ExplicitProperties.ContainsKey(propertyInfo)) { propertyConfiguration = ExplicitProperties[propertyInfo] as EnumPropertyConfiguration; if (propertyConfiguration == null) { throw Error.Argument("propertyInfo", SRResources.MustBeEnumProperty, propertyInfo.Name, ClrType.FullName); } } else { propertyConfiguration = new EnumPropertyConfiguration(propertyInfo, this); ExplicitProperties[propertyInfo] = propertyConfiguration; } return(propertyConfiguration); }
/// <summary> /// Adds a new EDM navigation property to this entity type. /// </summary> /// <param name="navigationProperty">The backing CLR property.</param> /// <param name="multiplicity">The <see cref="EdmMultiplicity"/> of the navigation property.</param> /// <returns>Returns the <see cref="NavigationPropertyConfiguration"/> of the added property.</returns> public NavigationPropertyConfiguration AddNavigationProperty(PropertyInfo navigationProperty, EdmMultiplicity multiplicity) { if (navigationProperty == null) { throw Error.ArgumentNull("navigationProperty"); } if (!navigationProperty.ReflectedType.IsAssignableFrom(ClrType)) { throw Error.InvalidOperation(SRResources.PropertyDoesNotBelongToType, navigationProperty.Name, ClrType.FullName); } ValidatePropertyNotAlreadyDefinedInBaseTypes(navigationProperty); ValidatePropertyNotAlreadyDefinedInDerivedTypes(navigationProperty); PropertyConfiguration propertyConfig; NavigationPropertyConfiguration navigationPropertyConfig; if (ExplicitProperties.ContainsKey(navigationProperty)) { propertyConfig = ExplicitProperties[navigationProperty]; if (propertyConfig.Kind != PropertyKind.Navigation) { throw Error.Argument("navigationProperty", SRResources.MustBeNavigationProperty, navigationProperty.Name, ClrType.FullName); } navigationPropertyConfig = propertyConfig as NavigationPropertyConfiguration; if (navigationPropertyConfig.Multiplicity != multiplicity) { throw Error.Argument("navigationProperty", SRResources.MustHaveMatchingMultiplicity, navigationProperty.Name, multiplicity); } } else { navigationPropertyConfig = new NavigationPropertyConfiguration(navigationProperty, multiplicity); ExplicitProperties[navigationProperty] = navigationPropertyConfig; // make sure the related type is configured ModelBuilder.AddEntity(navigationPropertyConfig.RelatedClrType); } return(navigationPropertyConfig); }
public NavigationPropertyConfiguration AddNavigationProperty(PropertyInfo navigationProperty, EdmMultiplicity multiplicity) { if (navigationProperty == null) { throw Error.ArgumentNull("navigationProperty"); } if (navigationProperty.DeclaringType != ClrType) { throw Error.Argument("navigationProperty", SRResources.PropertyDoesNotBelongToType); } PropertyConfiguration propertyConfig; NavigationPropertyConfiguration navigationPropertyConfig; if (ExplicitProperties.ContainsKey(navigationProperty)) { propertyConfig = ExplicitProperties[navigationProperty]; if (propertyConfig.Kind != PropertyKind.Navigation) { throw Error.Argument("navigationProperty", SRResources.MustBeNavigationProperty, navigationProperty.Name); } navigationPropertyConfig = propertyConfig as NavigationPropertyConfiguration; if (navigationPropertyConfig.Multiplicity != multiplicity) { throw Error.Argument("navigationProperty", SRResources.MustHaveMatchingMultiplicity, navigationProperty.Name, multiplicity); } } else { navigationPropertyConfig = new NavigationPropertyConfiguration(navigationProperty, multiplicity); ExplicitProperties[navigationProperty] = navigationPropertyConfig; // make sure the related type is configured ModelBuilder.AddEntity(navigationPropertyConfig.RelatedClrType); } return(navigationPropertyConfig); }