public virtual PrimitivePropertyConfiguration AddProperty(PropertyInfo propertyInfo) { if (propertyInfo == null) { throw Error.ArgumentNull("propertyInfo"); } if (!propertyInfo.DeclaringType.IsAssignableFrom(ClrType)) { throw Error.Argument("propertyInfo", SRResources.PropertyDoesNotBelongToType); } // Remove from the ignored properties if (IgnoredProperties.Contains(propertyInfo)) { IgnoredProperties.Remove(propertyInfo); } PrimitivePropertyConfiguration propertyConfiguration = null; if (ExplicitProperties.ContainsKey(propertyInfo)) { propertyConfiguration = ExplicitProperties[propertyInfo] as PrimitivePropertyConfiguration; if (propertyConfiguration == null) { throw Error.Argument("propertyInfo", SRResources.MustBePrimitiveProperty, propertyInfo.Name); } } else { propertyConfiguration = new PrimitivePropertyConfiguration(propertyInfo); ExplicitProperties[propertyInfo] = propertyConfiguration; } return propertyConfiguration; }
public void Keys_Returns_DeclaredKeys_IfNoBaseType() { // Arrange PrimitivePropertyConfiguration[] keys = new PrimitivePropertyConfiguration[0]; Mock<EntityTypeConfiguration> entity = new Mock<EntityTypeConfiguration>(); entity.Setup(e => e.BaseType).Returns<EntityTypeConfiguration>(null); entity.Setup(e => e.Keys).Returns(keys); // Act & Assert Assert.ReferenceEquals(keys, entity.Object.Keys()); }
public void RemoveKey_Removes_KeyProperty() { // Arrange var builder = new ODataModelBuilder(); var motorcycle = builder.AddEntity(typeof(Motorcycle)); PrimitivePropertyConfiguration modelProperty = motorcycle.AddProperty(typeof(Motorcycle).GetProperty("Model")); motorcycle.HasKey(typeof(Motorcycle).GetProperty("Model")); Assert.Equal(new[] { modelProperty }, motorcycle.Keys); // Act motorcycle.RemoveKey(modelProperty); // Assert Assert.Empty(motorcycle.Keys); }
private void CreateStructuralTypeBody(EdmStructuredType type, StructuralTypeConfiguration config) { foreach (PropertyConfiguration property in config.Properties) { switch (property.Kind) { case PropertyKind.Primitive: PrimitivePropertyConfiguration primitiveProperty = property as PrimitivePropertyConfiguration; type.AddStructuralProperty( primitiveProperty.PropertyInfo.Name, GetTypeKind(primitiveProperty.PropertyInfo.PropertyType), primitiveProperty.OptionalProperty); break; case PropertyKind.Complex: ComplexPropertyConfiguration complexProperty = property as ComplexPropertyConfiguration; IEdmComplexType complexType = _types[complexProperty.RelatedClrType] as IEdmComplexType; type.AddStructuralProperty( complexProperty.PropertyInfo.Name, new EdmComplexTypeReference(complexType, complexProperty.OptionalProperty)); break; case PropertyKind.Collection: CollectionPropertyConfiguration collectionProperty = property as CollectionPropertyConfiguration; IEdmTypeReference elementTypeReference = null; if (_types.ContainsKey(collectionProperty.ElementType)) { IEdmComplexType elementType = _types[collectionProperty.ElementType] as IEdmComplexType; elementTypeReference = new EdmComplexTypeReference(elementType, false); } else { elementTypeReference = EdmLibHelpers.GetEdmPrimitiveTypeReferenceOrNull(collectionProperty.ElementType); } type.AddStructuralProperty( collectionProperty.PropertyInfo.Name, new EdmCollectionTypeReference( new EdmCollectionType(elementTypeReference), collectionProperty.OptionalProperty)); break; default: break; } } }
/// <summary> /// Configures the key property(s) for this entity type. /// </summary> /// <param name="keyProperty">The property to be added to the key properties of this entity type.</param> /// <returns>Returns itself so that multiple calls can be chained.</returns> public IEntityTypeConfiguration HasKey(PropertyInfo keyProperty) { if (BaseType != null) { throw Error.InvalidOperation(SRResources.CannotDefineKeysOnDerivedTypes, FullName, BaseType.FullName); } PrimitivePropertyConfiguration propertyConfig = AddProperty(keyProperty); // keys are always required propertyConfig.IsRequired(); if (!_keys.Contains(propertyConfig)) { _keys.Add(propertyConfig); } return(this); }
public void Keys_Returns_DerivedKeys_IfBaseTypePresent() { // Arrange PrimitivePropertyConfiguration[] keys = new PrimitivePropertyConfiguration[0]; Mock<IEntityTypeConfiguration> baseBaseEntity = new Mock<IEntityTypeConfiguration>(); baseBaseEntity.Setup(e => e.Keys).Returns(keys); baseBaseEntity.Setup(e => e.BaseType).Returns<IEntityTypeConfiguration>(null); Mock<IEntityTypeConfiguration> baseEntity = new Mock<IEntityTypeConfiguration>(); baseEntity.Setup(e => e.BaseType).Returns(baseBaseEntity.Object); Mock<IEntityTypeConfiguration> entity = new Mock<IEntityTypeConfiguration>(); baseEntity.Setup(e => e.BaseType).Returns(baseEntity.Object); // Act & Assert Assert.ReferenceEquals(keys, entity.Object.Keys()); }
public void CanAddPrimitiveProperty_ForDependentEntityType() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); // Act builder.Entity <Role>().HasRequired(r => r.User, (r, u) => r.UserForeignKey == u.UserId); // Assert EntityTypeConfiguration dependentEntityType = builder.StructuralTypes.OfType <EntityTypeConfiguration>().FirstOrDefault(e => e.Name == "Role"); Assert.NotNull(dependentEntityType); PrimitivePropertyConfiguration primitiveConfig = Assert.Single(dependentEntityType.Properties.OfType <PrimitivePropertyConfiguration>()); Assert.Equal("UserForeignKey", primitiveConfig.Name); Assert.Equal("System.Int32", primitiveConfig.RelatedClrType.FullName); Assert.False(primitiveConfig.OptionalProperty); }
public void Keys_Returns_DerivedKeys_IfBaseTypePresent() { // Arrange PrimitivePropertyConfiguration[] keys = new PrimitivePropertyConfiguration[0]; Mock <EntityTypeConfiguration> baseBaseEntity = new Mock <EntityTypeConfiguration>(); baseBaseEntity.Setup(e => e.Keys).Returns(keys); baseBaseEntity.Setup(e => e.BaseType).Returns <EntityTypeConfiguration>(null); Mock <EntityTypeConfiguration> baseEntity = new Mock <EntityTypeConfiguration>(); baseEntity.Setup(e => e.BaseType).Returns(baseBaseEntity.Object); Mock <EntityTypeConfiguration> entity = new Mock <EntityTypeConfiguration>(); baseEntity.Setup(e => e.BaseType).Returns(baseEntity.Object); // Act & Assert Assert.ReferenceEquals(keys, entity.Object.Keys()); }
/// <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(ClrType)) { throw Error.Argument("propertyInfo", SRResources.PropertyDoesNotBelongToType, propertyInfo.Name, ClrType.FullName); } // Remove from the ignored properties if (RemovedProperties.Contains(propertyInfo)) { RemovedProperties.Remove(propertyInfo); } PrimitivePropertyConfiguration propertyConfiguration = null; if (ExplicitProperties.ContainsKey(propertyInfo)) { propertyConfiguration = ExplicitProperties[propertyInfo] as PrimitivePropertyConfiguration; if (propertyConfiguration == null) { throw Error.Argument("propertyInfo", SRResources.MustBePrimitiveProperty, propertyInfo.Name, ClrType.FullName); } } else { propertyConfiguration = new PrimitivePropertyConfiguration(propertyInfo, this); ExplicitProperties[propertyInfo] = propertyConfiguration; } return(propertyConfiguration); }
/// <summary> /// Removes the property from the entity keys collection. /// </summary> /// <param name="keyProperty">The key to be removed.</param> /// <remarks>This method just disable the property to be not a key anymore. It does not remove the property all together. /// To remove the property completely, use the method <see cref="RemoveProperty"/></remarks> public virtual void RemoveKey(PrimitivePropertyConfiguration keyProperty) { if (keyProperty == null) { throw Error.ArgumentNull("keyProperty"); } _keys.Remove(keyProperty); }
private void CreateStructuralTypeBody(EdmStructuredType type, StructuralTypeConfiguration config) { foreach (PropertyConfiguration property in config.Properties) { switch (property.Kind) { case PropertyKind.Primitive: PrimitivePropertyConfiguration primitiveProperty = property as PrimitivePropertyConfiguration; EdmPrimitiveTypeKind typeKind = GetTypeKind(primitiveProperty.PropertyInfo.PropertyType); IEdmTypeReference primitiveTypeReference = EdmCoreModel.Instance.GetPrimitive( typeKind, primitiveProperty.OptionalProperty); var primitiveProp = new EdmStructuralProperty( type, primitiveProperty.PropertyInfo.Name, primitiveTypeReference); type.AddProperty(primitiveProp); // Set Annotation StoreGeneratedPattern if (config.Kind == EdmTypeKind.Entity && primitiveProperty.StoreGeneratedPattern != DatabaseGeneratedOption.None) { _directValueAnnotations.Add( new StoreGeneratedPatternAnnotation(primitiveProp, primitiveProperty.StoreGeneratedPattern)); } break; case PropertyKind.Complex: ComplexPropertyConfiguration complexProperty = property as ComplexPropertyConfiguration; IEdmComplexType complexType = _types[complexProperty.RelatedClrType] as IEdmComplexType; type.AddStructuralProperty( complexProperty.PropertyInfo.Name, new EdmComplexTypeReference(complexType, complexProperty.OptionalProperty)); break; case PropertyKind.Collection: CollectionPropertyConfiguration collectionProperty = property as CollectionPropertyConfiguration; IEdmTypeReference elementTypeReference = null; if (_types.ContainsKey(collectionProperty.ElementType)) { IEdmComplexType elementType = _types[collectionProperty.ElementType] as IEdmComplexType; elementTypeReference = new EdmComplexTypeReference(elementType, false); } else { elementTypeReference = EdmLibHelpers.GetEdmPrimitiveTypeReferenceOrNull(collectionProperty.ElementType); } type.AddStructuralProperty( collectionProperty.PropertyInfo.Name, new EdmCollectionTypeReference( new EdmCollectionType(elementTypeReference), collectionProperty.OptionalProperty)); break; default: break; } } }
private void CreatePrimitiveProperty(PrimitivePropertyConfiguration primitiveProperty, EdmStructuredType type, StructuralTypeConfiguration config, out IEdmProperty edmProperty) { EdmPrimitiveTypeKind typeKind = GetTypeKind(primitiveProperty.PropertyInfo.PropertyType); IEdmTypeReference primitiveTypeReference = EdmCoreModel.Instance.GetPrimitive( typeKind, primitiveProperty.OptionalProperty); // Set concurrency token if is entity type, and concurrency token is true EdmConcurrencyMode concurrencyMode = EdmConcurrencyMode.None; if (config.Kind == EdmTypeKind.Entity && primitiveProperty.ConcurrencyToken) { concurrencyMode = EdmConcurrencyMode.Fixed; } var primitiveProp = new EdmStructuralProperty( type, primitiveProperty.PropertyInfo.Name, primitiveTypeReference, defaultValueString: null, concurrencyMode: concurrencyMode); type.AddProperty(primitiveProp); edmProperty = primitiveProp; // Set Annotation StoreGeneratedPattern if (config.Kind == EdmTypeKind.Entity && primitiveProperty.StoreGeneratedPattern != DatabaseGeneratedOption.None) { _directValueAnnotations.Add( new StoreGeneratedPatternAnnotation(primitiveProp, primitiveProperty.StoreGeneratedPattern)); } }