public void Apply_KeyNameConventions_Works() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration principalEntity = builder.AddEntity(typeof(DiscoveryPrincipalEntity)); PropertyInfo propertyInfo = typeof(DiscoveryPrincipalEntity).GetProperty("DiscoveryPrincipalEntityId"); principalEntity.HasKey(propertyInfo); EntityTypeConfiguration dependentEntity = builder.AddEntity(typeof(DiscoveryDependentEntity)); PropertyInfo expectPropertyInfo = typeof(DiscoveryDependentEntity).GetProperty("DiscoveryPrincipalEntityId"); dependentEntity.AddProperty(expectPropertyInfo); PropertyInfo navigationPropertyInfo = typeof(DiscoveryDependentEntity).GetProperty("Principal"); NavigationPropertyConfiguration navigation = dependentEntity.AddNavigationProperty(navigationPropertyInfo, EdmMultiplicity.One); navigation.AddedExplicitly = false; // Act new ForeignKeyDiscoveryConvention().Apply(navigation, dependentEntity); // Assert PropertyInfo actualPropertyInfo = Assert.Single(navigation.DependentProperties); Assert.Same(expectPropertyInfo, actualPropertyInfo); PropertyInfo principalProperty = Assert.Single(navigation.PrincipalProperties); Assert.Equal("DiscoveryPrincipalEntityId", principalProperty.Name); }
public void Apply_KeyNameConventions_Works() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration principalEntity = builder.AddEntity(typeof(DiscoveryPrincipalEntity)); PropertyInfo propertyInfo = typeof(DiscoveryPrincipalEntity).GetProperty("DiscoveryPrincipalEntityId"); principalEntity.HasKey(propertyInfo); EntityTypeConfiguration dependentEntity = builder.AddEntity(typeof(DiscoveryDependentEntity)); PropertyInfo expectPropertyInfo = typeof(DiscoveryDependentEntity).GetProperty("DiscoveryPrincipalEntityId"); dependentEntity.AddProperty(expectPropertyInfo); PropertyInfo navigationPropertyInfo = typeof(DiscoveryDependentEntity).GetProperty("Principal"); NavigationPropertyConfiguration navigation = dependentEntity.AddNavigationProperty(navigationPropertyInfo, EdmMultiplicity.One); navigation.AddedExplicitly = false; // Act new ForeignKeyDiscoveryConvention().Apply(navigation, dependentEntity); // Assert PropertyInfo actualPropertyInfo = Assert.Single(navigation.DependentProperties); Assert.Same(expectPropertyInfo, actualPropertyInfo); PropertyInfo principalProperty = Assert.Single(navigation.PrincipalProperties); Assert.Equal("DiscoveryPrincipalEntityId", principalProperty.Name); }
public void CreateModelUsingProgrammableApi() { var builder = new ODataModelBuilder(); var customerConfig = builder.AddEntity(typeof(Customer)); customerConfig.HasKey(typeof(Customer).GetProperty("CustomerId")); customerConfig.AddProperty(typeof(Customer).GetProperty("Name")); var ordersPropertyConfig = customerConfig.AddNavigationProperty(typeof(Customer).GetProperty("Orders"), EdmMultiplicity.Many); var orderConfig = builder.AddEntity(typeof(Order)); orderConfig.HasKey(typeof(Order).GetProperty("OrderId")); orderConfig.AddProperty(typeof(Order).GetProperty("Cost")); var customersSetConfig = builder.AddEntitySet("Customers", customerConfig); var ordersSetConfig = builder.AddEntitySet("Orders", orderConfig); customersSetConfig.AddBinding(ordersPropertyConfig, ordersSetConfig); var model = builder.GetServiceModel(); var customerType = model.SchemaElements.OfType<IEdmEntityType>().Single(e => e.Name == "Customer"); Assert.NotNull(customerType); Assert.Equal(typeof(Customer).Namespace, customerType.Namespace); Assert.Equal(3, customerType.DeclaredProperties.Count()); var key = customerType.DeclaredKey.SingleOrDefault(); Assert.NotNull(key); Assert.Equal("CustomerId", key.Name); Assert.True(key.Type.IsInt32()); Assert.False(key.Type.IsNullable); var nameProperty = customerType.DeclaredProperties.SingleOrDefault(dp => dp.Name == "Name"); Assert.NotNull(nameProperty); Assert.True(nameProperty.Type.IsString()); Assert.True(nameProperty.Type.IsNullable); Assert.Equal(1, customerType.NavigationProperties().Count()); var ordersProperty = customerType.NavigationProperties().Single(); Assert.Equal("Orders", ordersProperty.Name); Assert.Equal(EdmTypeKind.Collection, ordersProperty.Type.Definition.TypeKind); Assert.Equal(typeof(Order).FullName, (ordersProperty.Type.Definition as IEdmCollectionType).ElementType.FullName()); var entityContainer = model.EntityContainers().Single(); Assert.NotNull(entityContainer); var customers = entityContainer.FindEntitySet("Customers"); Assert.NotNull(customers); Assert.Equal(typeof(Customer).FullName, customers.ElementType.FullName()); var orders = entityContainer.FindEntitySet("Orders"); Assert.NotNull(orders); Assert.Equal(typeof(Order).FullName, orders.ElementType.FullName()); }
public void GetTargetEntitySet_Returns_TargetEntitySet() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); IEntityTypeConfiguration motorcycle = builder.AddEntity(typeof(Motorcycle)); IEntityTypeConfiguration manufacturer = builder.AddEntity(typeof(MotorcycleManufacturer)); NavigationPropertyConfiguration navigationProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); IEntitySetConfiguration manufacturers = builder.AddEntitySet("manufacturers", manufacturer); // Act IEntitySetConfiguration targetEntitySet = AssociationSetDiscoveryConvention.GetTargetEntitySet(navigationProperty, builder); // Assert Assert.Equal(manufacturers, targetEntitySet); }
public void Apply_SingleForeignKeyOnForeignKeyProperty_Works() { // Arrange Type dependentType = typeof(SingleDependentEntity2); ODataModelBuilder builder = new ODataModelBuilder(); builder.Entity <PrincipalEntity>().HasKey(p => p.PrincipalIntId); EntityTypeConfiguration dependentEntity = builder.AddEntity(dependentType); PropertyInfo expectPropertyInfo = dependentType.GetProperty("PrincipalId"); PrimitivePropertyConfiguration primitiveProperty = dependentEntity.AddProperty(expectPropertyInfo); PropertyInfo propertyInfo = dependentType.GetProperty("Principal"); NavigationPropertyConfiguration navigation = dependentEntity.AddNavigationProperty(propertyInfo, EdmMultiplicity.ZeroOrOne); navigation.AddedExplicitly = false; // Act new ForeignKeyAttributeConvention().Apply(primitiveProperty, dependentEntity); // Assert PropertyInfo actualPropertyInfo = Assert.Single(navigation.DependentProperties); Assert.Same(expectPropertyInfo, actualPropertyInfo); Assert.Equal("PrincipalIntId", Assert.Single(navigation.PrincipalProperties).Name); Assert.False(primitiveProperty.OptionalProperty); }
public void Apply_SingleForeignKeyOnForeignKeyProperty_Works() { // Arrange Type dependentType = typeof(SingleDependentEntity2); ODataModelBuilder builder = new ODataModelBuilder(); builder.Entity<PrincipalEntity>().HasKey(p => p.PrincipalIntId); EntityTypeConfiguration dependentEntity = builder.AddEntity(dependentType); PropertyInfo expectPropertyInfo = dependentType.GetProperty("PrincipalId"); PrimitivePropertyConfiguration primitiveProperty = dependentEntity.AddProperty(expectPropertyInfo); PropertyInfo propertyInfo = dependentType.GetProperty("Principal"); NavigationPropertyConfiguration navigation = dependentEntity.AddNavigationProperty(propertyInfo, EdmMultiplicity.ZeroOrOne); navigation.AddedExplicitly = false; // Act new ForeignKeyAttributeConvention().Apply(primitiveProperty, dependentEntity); // Assert PropertyInfo actualPropertyInfo = Assert.Single(navigation.DependentProperties); Assert.Same(expectPropertyInfo, actualPropertyInfo); Assert.Equal("PrincipalIntId", Assert.Single(navigation.PrincipalProperties).Name); Assert.False(primitiveProperty.OptionalProperty); }
public void Apply_IgnoreEmptyAndUnknownForeignKeyProperty() { // Arrange Type dependentType = typeof(InvalidDependentEntity); ODataModelBuilder builder = new ODataModelBuilder(); builder.Entity <PrincipalEntity>().HasKey(p => new { p.PrincipalIntId, p.PrincipalStringId }); EntityTypeConfiguration dependentEntity = builder.AddEntity(dependentType); PropertyInfo expectPropertyInfo1 = dependentType.GetProperty("PrincipalId1"); dependentEntity.AddProperty(expectPropertyInfo1); PropertyInfo expectPropertyInfo2 = dependentType.GetProperty("PrincipalId2"); dependentEntity.AddProperty(expectPropertyInfo2); PropertyInfo propertyInfo = dependentType.GetProperty("Principal"); NavigationPropertyConfiguration navigation = dependentEntity.AddNavigationProperty(propertyInfo, EdmMultiplicity.One); navigation.AddedExplicitly = false; // Act & Assert new ForeignKeyAttributeConvention().Apply(navigation, dependentEntity); // Assert Assert.Equal(2, navigation.DependentProperties.Count()); Assert.Same(expectPropertyInfo1, navigation.DependentProperties.First()); Assert.Same(expectPropertyInfo2, navigation.DependentProperties.Last()); }
public void RemoveStructuralType_RemovesEntityType() { ODataModelBuilder builder = new ODataModelBuilder(); builder.AddEntity(typeof(Customer)); Assert.NotEmpty(builder.StructuralTypes); builder.RemoveStructuralType(typeof(Customer)); Assert.Empty(builder.StructuralTypes); }
public void CanAddBinding_For_DerivedNavigationProperty() { ODataModelBuilder builder = new ODataModelBuilder(); var vehicle = builder.AddEntity(typeof(Vehicle)); var motorcycle = builder.AddEntity(typeof(Motorcycle)).DerivesFrom(vehicle); var manufacturer = builder.AddEntity(typeof(MotorcycleManufacturer)); var manufacturers = builder.AddEntitySet("manufacturers", manufacturer); var navProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.One); var vehicles = builder.AddEntitySet("vehicles", vehicle); vehicles.AddBinding(navProperty, manufacturers); IEdmModel model = builder.GetEdmModel(); var motorcycleEdmType = model.AssertHasEntityType(typeof(Motorcycle)); var edmNavProperty = motorcycleEdmType.AssertHasNavigationProperty(model, "Manufacturer", typeof(MotorcycleManufacturer), isNullable: false, multiplicity: EdmMultiplicity.One); Assert.Equal( "manufacturers", model.EntityContainers().Single().FindEntitySet("vehicles").FindNavigationTarget(edmNavProperty).Name); }
public void AssociationSetDiscoveryConvention_AddsBindingForBaseAndDerivedNavigationProperties() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); IEntityTypeConfiguration vehicle = builder.AddEntity(typeof(Vehicle)); IEntityTypeConfiguration car = builder.AddEntity(typeof(Car)).DerivesFrom(vehicle); NavigationPropertyConfiguration carNavigationProperty = car.AddNavigationProperty(typeof(Car).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); IEntityTypeConfiguration motorcycle = builder.AddEntity(typeof(Motorcycle)).DerivesFrom(vehicle); NavigationPropertyConfiguration motorcycleNavigationProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); IEntityTypeConfiguration manufacturer = builder.AddEntity(typeof(Manufacturer)); IEntityTypeConfiguration motorcycleManufacturer = builder.AddEntity(typeof(MotorcycleManufacturer)).DerivesFrom(manufacturer); IEntityTypeConfiguration carManufacturer = builder.AddEntity(typeof(CarManufacturer)).DerivesFrom(manufacturer); IEntitySetConfiguration manufacturers = builder.AddEntitySet("manufacturers", manufacturer); Mock <IEntitySetConfiguration> entitySet = new Mock <IEntitySetConfiguration>(MockBehavior.Strict); entitySet.Setup(v => v.EntityType).Returns(vehicle); entitySet.Setup(v => v.AddBinding(motorcycleNavigationProperty, manufacturers)).Returns <NavigationPropertyConfiguration>(null); entitySet.Setup(v => v.AddBinding(carNavigationProperty, manufacturers)).Returns <NavigationPropertyConfiguration>(null); // Act _convention.Apply(entitySet.Object, builder); // Assert entitySet.VerifyAll(); }
public void AssociationSetDiscoveryConvention_AddsBindingForBaseAndDerivedNavigationProperties() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration vehicle = builder.AddEntity(typeof(Vehicle)); EntityTypeConfiguration car = builder.AddEntity(typeof(Car)).DerivesFrom(vehicle); NavigationPropertyConfiguration carNavigationProperty = car.AddNavigationProperty(typeof(Car).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); EntityTypeConfiguration motorcycle = builder.AddEntity(typeof(Motorcycle)).DerivesFrom(vehicle); NavigationPropertyConfiguration motorcycleNavigationProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); EntityTypeConfiguration manufacturer = builder.AddEntity(typeof(Manufacturer)); EntityTypeConfiguration motorcycleManufacturer = builder.AddEntity(typeof(MotorcycleManufacturer)).DerivesFrom(manufacturer); EntityTypeConfiguration carManufacturer = builder.AddEntity(typeof(CarManufacturer)).DerivesFrom(manufacturer); EntitySetConfiguration manufacturers = builder.AddEntitySet("manufacturers", manufacturer); Mock<EntitySetConfiguration> entitySet = new Mock<EntitySetConfiguration>(MockBehavior.Strict); entitySet.Setup(v => v.EntityType).Returns(vehicle); entitySet.Setup(v => v.AddBinding(motorcycleNavigationProperty, manufacturers)).Returns<NavigationPropertyConfiguration>(null); entitySet.Setup(v => v.AddBinding(carNavigationProperty, manufacturers)).Returns<NavigationPropertyConfiguration>(null); // Act _convention.Apply(entitySet.Object, builder); // Assert entitySet.VerifyAll(); }
public void GetTargetEntitySet_Returns_Null_IfNoMatchingTargetEntitySet() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration motorcycle = builder.AddEntity(typeof(Motorcycle)); NavigationPropertyConfiguration navigationProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); // Act EntitySetConfiguration targetEntitySet = AssociationSetDiscoveryConvention.GetTargetEntitySet(navigationProperty, builder); // Assert Assert.Null(targetEntitySet); }
public void Apply_DoesnotModify_ExplicitlyAddedAction() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); PropertyInfo propertyInfo = typeof(TestOrder).GetProperty("Customer"); EntityTypeConfiguration entity = builder.AddEntity(typeof(TestOrder)); NavigationPropertyConfiguration navProperty = entity.AddNavigationProperty(propertyInfo, EdmMultiplicity.One); navProperty.OnDeleteAction = EdmOnDeleteAction.None; // Act new ActionOnDeleteAttributeConvention().Apply(navProperty, entity); // Assert Assert.Equal(EdmOnDeleteAction.None, navProperty.OnDeleteAction); }
public void CanAddNavigationLink_For_DerivedNavigationProperty() { ODataModelBuilder builder = new ODataModelBuilder(); var vehicle = builder.AddEntity(typeof(Vehicle)); var motorcycle = builder.AddEntity(typeof(Motorcycle)).DerivesFrom(vehicle); var manufacturer = builder.AddEntity(typeof(MotorcycleManufacturer)); var manufacturers = builder.AddEntitySet("manufacturers", manufacturer); var navProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.One); var vehicles = builder.AddEntitySet("vehicles", vehicle); var binding = vehicles.AddBinding(navProperty, manufacturers); vehicles.HasNavigationPropertyLink(navProperty, new NavigationLinkBuilder((ctxt, property) => new Uri("http://works/"), followsConventions: false)); IEdmModel model = builder.GetEdmModel(); var motorcycleEdmType = model.AssertHasEntityType(typeof(Motorcycle)); var edmNavProperty = motorcycleEdmType.AssertHasNavigationProperty(model, "Manufacturer", typeof(MotorcycleManufacturer), isNullable: false, multiplicity: EdmMultiplicity.One); var vehiclesEdmSet = model.EntityContainers().Single().FindEntitySet("vehicles"); Assert.NotNull(model.GetEntitySetLinkBuilder(vehiclesEdmSet)); Assert.Equal( "http://works/", model.GetEntitySetLinkBuilder(vehiclesEdmSet).BuildNavigationLink(new EntityInstanceContext(), edmNavProperty, ODataMetadataLevel.Default).AbsoluteUri); }
public void Apply_DoesnotRemove_ExplicitlyAddedProperties() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); PropertyInfo propertyInfo = typeof(TestEntity).GetProperty("Property"); EntityTypeConfiguration entity = builder.AddEntity(typeof(TestEntity)); PropertyConfiguration property = entity.AddProperty(propertyInfo); // Act new NotMappedAttributeConvention().Apply(property, entity); // Assert Assert.Contains(propertyInfo, entity.ExplicitProperties.Keys); Assert.DoesNotContain(propertyInfo, entity.RemovedProperties); }
public void Apply_DoesnotRemove_ExplicitlyAddedProperties() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); PropertyInfo propertyInfo = typeof(TestEntity).GetProperty("Property"); EntityTypeConfiguration entity = builder.AddEntity(typeof(TestEntity)); PropertyConfiguration property = entity.AddProperty(propertyInfo); // Act new NotMappedAttributeConvention().Apply(property, entity); // Assert Assert.Contains(propertyInfo, entity.ExplicitProperties.Keys); Assert.DoesNotContain(propertyInfo, entity.RemovedProperties); }
public void Apply_DoesnotModify_ExplicitlyAddedAction() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); PropertyInfo propertyInfo = typeof(TestOrder).GetProperty("Customer"); EntityTypeConfiguration entity = builder.AddEntity(typeof(TestOrder)); NavigationPropertyConfiguration navProperty = entity.AddNavigationProperty(propertyInfo, EdmMultiplicity.One); navProperty.OnDeleteAction = EdmOnDeleteAction.None; // Act new ActionOnDeleteAttributeConvention().Apply(navProperty, entity); // Assert Assert.Equal(EdmOnDeleteAction.None, navProperty.OnDeleteAction); }
public void Apply_ActionOnDeleteAttribute_Works() { // Arrange Type orderType = typeof(TestOrder); ODataModelBuilder builder = new ODataModelBuilder(); PropertyInfo propertyInfo = typeof(TestOrder).GetProperty("Customer"); EntityTypeConfiguration entity = builder.AddEntity(orderType); NavigationPropertyConfiguration navProperty = entity.AddNavigationProperty(propertyInfo, EdmMultiplicity.One); navProperty.AddedExplicitly = false; navProperty.HasConstraint(orderType.GetProperty("CustomerId"), typeof(TestCustomer).GetProperty("Id")); // Act new ActionOnDeleteAttributeConvention().Apply(navProperty, entity); // Assert Assert.Equal(EdmOnDeleteAction.Cascade, navProperty.OnDeleteAction); }
/// <summary> /// If a caller wants to tweak the <see cref="ODataModelBuilder"/>, this method can be used instead of <see cref="BuildEdmModel"/>, /// so that the caller can modify <paramref name="modelBuilder"/> before or after the entity sets are added. /// </summary> /// <param name="modelBuilder">An <see cref="ODataModelBuilder"/> or <see cref="ODataConventionModelBuilder"/>.</param> public virtual void ConfigureModelBuilder(ODataModelBuilder modelBuilder) { modelBuilder.ContainerName = _containerMetadata.Name; modelBuilder.Namespace = _containerMetadata.Namespace; // Add all entity types foreach (IEntityTypeMetadata entityTypeMetadata in _containerMetadata.EntityTypes) { EntityTypeConfiguration entityTypeConfig = modelBuilder.AddEntity(entityTypeMetadata.ClrType); } // Add all entity sets foreach (IEntitySetMetadata entitySetMetadata in _containerMetadata.EntitySets) { string entitySetName = entitySetMetadata.Name; EntityTypeConfiguration entityTypeConfig = (EntityTypeConfiguration)modelBuilder.GetTypeConfigurationOrNull(entitySetMetadata.ElementTypeMetadata.ClrType); EntitySetConfiguration entitySetConfig = modelBuilder.AddEntitySet(entitySetName, entityTypeConfig); } }
public void Apply_ActionOnDeleteAttribute_Works() { // Arrange Type orderType = typeof(TestOrder); ODataModelBuilder builder = new ODataModelBuilder(); PropertyInfo propertyInfo = typeof(TestOrder).GetProperty("Customer"); EntityTypeConfiguration entity = builder.AddEntity(orderType); NavigationPropertyConfiguration navProperty = entity.AddNavigationProperty(propertyInfo, EdmMultiplicity.One); navProperty.AddedExplicitly = false; navProperty.HasConstraint(orderType.GetProperty("CustomerId"), typeof(TestCustomer).GetProperty("Id")); // Act new ActionOnDeleteAttributeConvention().Apply(navProperty, entity); // Assert Assert.Equal(EdmOnDeleteAction.Cascade, navProperty.OnDeleteAction); }
public void Apply_MultiForeignKeysOnForeignKeyProperty_Works() { // Arrange Type dependentType = typeof(MultiDependentEntity2); ODataModelBuilder builder = new ODataModelBuilder(); builder.Entity <PrincipalEntity>().HasKey(p => new { p.PrincipalIntId, p.PrincipalStringId }); EntityTypeConfiguration dependentEntity = builder.AddEntity(dependentType); PropertyInfo expectPropertyInfo1 = dependentType.GetProperty("PrincipalId1"); PrimitivePropertyConfiguration propertyConfig1 = dependentEntity.AddProperty(expectPropertyInfo1); PropertyInfo expectPropertyInfo2 = dependentType.GetProperty("PrincipalId2"); PrimitivePropertyConfiguration propertyConfig2 = dependentEntity.AddProperty(expectPropertyInfo2); PropertyInfo propertyInfo = dependentType.GetProperty("Principal"); NavigationPropertyConfiguration navigation = dependentEntity.AddNavigationProperty(propertyInfo, EdmMultiplicity.One); navigation.AddedExplicitly = false; // Act ForeignKeyAttributeConvention convention = new ForeignKeyAttributeConvention(); convention.Apply(propertyConfig1, dependentEntity); convention.Apply(propertyConfig2, dependentEntity); // Assert Assert.Equal(2, navigation.DependentProperties.Count()); Assert.Same(expectPropertyInfo1, navigation.DependentProperties.First()); Assert.Same(expectPropertyInfo2, navigation.DependentProperties.Last()); Assert.Equal(2, navigation.PrincipalProperties.Count()); Assert.Equal("PrincipalIntId", navigation.PrincipalProperties.First().Name); Assert.Equal("PrincipalStringId", navigation.PrincipalProperties.Last().Name); }
public void Apply_AddsNavigationLinkFor_AllBaseDeclaredAndDerivedProperties() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration vehicle = builder.AddEntity(typeof(Vehicle)); EntityTypeConfiguration car = builder.AddEntity(typeof(Car)).DerivesFrom(vehicle); NavigationPropertyConfiguration carNavigationProperty = car.AddNavigationProperty(typeof(Car).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); EntityTypeConfiguration motorcycle = builder.AddEntity(typeof(Motorcycle)).DerivesFrom(vehicle); NavigationPropertyConfiguration motorcycleNavigationProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); EntityTypeConfiguration manufacturer = builder.AddEntity(typeof(Manufacturer)); EntityTypeConfiguration motorcycleManufacturer = builder.AddEntity(typeof(MotorcycleManufacturer)).DerivesFrom(manufacturer); EntityTypeConfiguration carManufacturer = builder.AddEntity(typeof(CarManufacturer)).DerivesFrom(manufacturer); EntitySetConfiguration manufacturers = builder.AddEntitySet("manufacturers", manufacturer); Mock <EntitySetConfiguration> entitySet = new Mock <EntitySetConfiguration>(MockBehavior.Strict); entitySet.Setup(v => v.EntityType).Returns(vehicle); entitySet.Setup(v => v.GetNavigationPropertyLink(motorcycleNavigationProperty)).Returns <NavigationPropertyConfiguration>(null); entitySet.Setup(v => v.GetNavigationPropertyLink(carNavigationProperty)).Returns <NavigationPropertyConfiguration>(null); entitySet .Setup(v => v.HasNavigationPropertyLink(motorcycleNavigationProperty, It.IsAny <NavigationLinkBuilder>())) .Callback((NavigationPropertyConfiguration property, NavigationLinkBuilder navBuilder) => Assert.True(navBuilder.FollowsConventions)) .Returns <EntitySetConfiguration>(null); entitySet .Setup(v => v.HasNavigationPropertyLink(carNavigationProperty, It.IsAny <NavigationLinkBuilder>())) .Returns <EntitySetConfiguration>(null); // Act _convention.Apply(entitySet.Object, builder); // Assert entitySet.VerifyAll(); }
public void Apply_AddsNavigationLinkFor_AllBaseDeclaredAndDerivedProperties() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration vehicle = builder.AddEntity(typeof(Vehicle)); EntityTypeConfiguration car = builder.AddEntity(typeof(Car)).DerivesFrom(vehicle); NavigationPropertyConfiguration carNavigationProperty = car.AddNavigationProperty(typeof(Car).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); EntityTypeConfiguration motorcycle = builder.AddEntity(typeof(Motorcycle)).DerivesFrom(vehicle); NavigationPropertyConfiguration motorcycleNavigationProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); EntityTypeConfiguration manufacturer = builder.AddEntity(typeof(Manufacturer)); EntityTypeConfiguration motorcycleManufacturer = builder.AddEntity(typeof(MotorcycleManufacturer)).DerivesFrom(manufacturer); EntityTypeConfiguration carManufacturer = builder.AddEntity(typeof(CarManufacturer)).DerivesFrom(manufacturer); EntitySetConfiguration manufacturers = builder.AddEntitySet("manufacturers", manufacturer); Mock<EntitySetConfiguration> entitySet = new Mock<EntitySetConfiguration>(MockBehavior.Strict); entitySet.Setup(v => v.EntityType).Returns(vehicle); entitySet.Setup(v => v.GetNavigationPropertyLink(motorcycleNavigationProperty)).Returns<NavigationPropertyConfiguration>(null); entitySet.Setup(v => v.GetNavigationPropertyLink(carNavigationProperty)).Returns<NavigationPropertyConfiguration>(null); entitySet .Setup(v => v.HasNavigationPropertyLink(motorcycleNavigationProperty, It.IsAny<NavigationLinkBuilder>())) .Callback((NavigationPropertyConfiguration property, NavigationLinkBuilder navBuilder) => Assert.True(navBuilder.FollowsConventions)) .Returns<EntitySetConfiguration>(null); entitySet .Setup(v => v.HasNavigationPropertyLink(carNavigationProperty, It.IsAny<NavigationLinkBuilder>())) .Returns<EntitySetConfiguration>(null); // Act _convention.Apply(entitySet.Object, builder); // Assert entitySet.VerifyAll(); }
public void ActionLink_PreservesFollowsConventions(bool value) { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); ActionConfiguration configuration = new ActionConfiguration(builder, "IgnoreAction"); Mock<IEdmTypeConfiguration> bindingParameterTypeMock = new Mock<IEdmTypeConfiguration>(); bindingParameterTypeMock.Setup(o => o.Kind).Returns(EdmTypeKind.Entity); Type entityType = typeof(object); bindingParameterTypeMock.Setup(o => o.ClrType).Returns(entityType); configuration.SetBindingParameter("IgnoreParameter", bindingParameterTypeMock.Object, alwaysBindable: false); configuration.HasActionLink((a) => { throw new NotImplementedException(); }, followsConventions: value); builder.AddProcedure(configuration); builder.AddEntity(entityType); // Act IEdmModel model = builder.GetEdmModel(); // Assert IEdmFunctionImport functionImport = model.EntityContainers().Single().Elements.OfType<IEdmFunctionImport>().Single(); ActionLinkBuilder actionLinkBuilder = model.GetActionLinkBuilder(functionImport); Assert.Equal(value, actionLinkBuilder.FollowsConventions); }
public void AddNavigationLink_For_NavigationPropertyInHierarchy_Throws() { ODataModelBuilder builder = new ODataModelBuilder(); var vehicle = builder.AddEntity(typeof(Vehicle)); var motorcycle = builder.AddEntity(typeof(Motorcycle)); var manufacturer = builder.AddEntity(typeof(MotorcycleManufacturer)); var manufacturers = builder.AddEntitySet("manufacturers", manufacturer); var navProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.One); var vehicles = builder.AddEntitySet("vehicles", vehicle); Assert.ThrowsArgument( () => vehicles.HasNavigationPropertyLink(navProperty, new NavigationLinkBuilder((ctxt, property) => new Uri("http://works/"), followsConventions: false)), "navigationProperty", "The declaring entity type 'System.Web.Http.OData.Builder.TestModels.Motorcycle' of the given navigation property is not a part of the entity type 'System.Web.Http.OData.Builder.TestModels.Vehicle' hierarchy of the entity set 'vehicles'."); }
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); }
public void Apply_MultiForeignKeysOnNavigationProperty_Works() { // Arrange Type dependentType = typeof(MultiDependentEntity); ODataModelBuilder builder = new ODataModelBuilder(); builder.Entity<PrincipalEntity>().HasKey(p => new { p.PrincipalIntId, p.PrincipalStringId }); EntityTypeConfiguration dependentEntity = builder.AddEntity(dependentType); PropertyInfo expectPropertyInfo1 = dependentType.GetProperty("PrincipalId1"); dependentEntity.AddProperty(expectPropertyInfo1); PropertyInfo expectPropertyInfo2 = dependentType.GetProperty("PrincipalId2"); dependentEntity.AddProperty(expectPropertyInfo2); PropertyInfo propertyInfo = typeof(MultiDependentEntity).GetProperty("Principal"); NavigationPropertyConfiguration navigation = dependentEntity.AddNavigationProperty(propertyInfo, EdmMultiplicity.One); navigation.AddedExplicitly = false; // Act new ForeignKeyAttributeConvention().Apply(navigation, dependentEntity); // Assert Assert.Equal(2, navigation.DependentProperties.Count()); Assert.Same(expectPropertyInfo1, navigation.DependentProperties.First()); Assert.Same(expectPropertyInfo2, navigation.DependentProperties.Last()); Assert.Equal(2, navigation.PrincipalProperties.Count()); Assert.Equal("PrincipalIntId", navigation.PrincipalProperties.First().Name); Assert.Equal("PrincipalStringId", navigation.PrincipalProperties.Last().Name); }
public void HasConstraint_Throws_NotSupported_ForMany() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration entityType = builder.AddEntity(typeof(Dependent)); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(new MockPropertyInfo(typeof(IList<int>), "Users"), EdmMultiplicity.Many, entityType); // Assert & Act Assert.Throws<NotSupportedException>( () => navigationProperty.HasConstraint(new MockPropertyInfo(), new MockPropertyInfo()), String.Format(SRResources.ReferentialConstraintOnManyNavigationPropertyNotSupported, navigationProperty.Name, navigationProperty.DeclaringEntityType.ClrType.FullName)); }
public void GetTargetEntitySet_Returns_BaseTypeEntitySet_IfNoMatchingEntitysetForCurrentType() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration motorcycle = builder.AddEntity(typeof(Motorcycle)); EntityTypeConfiguration manufacturer = builder.AddEntity(typeof(Manufacturer)); EntityTypeConfiguration motorcycleManufacturer = builder.AddEntity(typeof(MotorcycleManufacturer)).DerivesFrom(manufacturer); NavigationPropertyConfiguration navigationProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); EntitySetConfiguration manufacturers = builder.AddEntitySet("manufacturers", manufacturer); // Act EntitySetConfiguration targetEntitySet = AssociationSetDiscoveryConvention.GetTargetEntitySet(navigationProperty, builder); // Assert Assert.Equal(manufacturers, targetEntitySet); }
public void BaseTypeConfigured_IsFalseByDefault() { var builder = new ODataModelBuilder(); var motorcycle = builder.AddEntity(typeof(Motorcycle)); Assert.False(motorcycle.BaseTypeConfigured); }
public EntitySetLinkBuilderAnnotationTest() { _modelBuilder = new ODataModelBuilder(); _entitySet = _modelBuilder.AddEntitySet("Customers", _modelBuilder.AddEntity(typeof(Customer))); }
public void HasConstraint_DoesnotAddTwice_ForSameConstraint() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration entity = builder.AddEntity(typeof(Dependent)); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.ZeroOrOne, entity); PropertyInfo principalProperty = typeof(Principal).GetProperty("PrincipalKey1"); PropertyInfo dependentProperty = typeof(Dependent).GetProperty("DependentKey1"); // Act navigationProperty.HasConstraint(dependentProperty, principalProperty); navigationProperty.HasConstraint(dependentProperty, principalProperty); // Assert PropertyInfo actualInfo = Assert.Single(navigationProperty.DependentProperties); Assert.Same(dependentProperty, actualInfo); PropertyInfo actualPrincipalInfo = Assert.Single(navigationProperty.PrincipalProperties); Assert.Same(principalProperty, actualPrincipalInfo); }
public void RemoveKey_ThrowsArgumentNull() { // Arrange var builder = new ODataModelBuilder(); var motorcycle = builder.AddEntity(typeof(Motorcycle)); // Act & Assert Assert.ThrowsArgumentNull( () => motorcycle.RemoveKey(keyProperty: null), "keyProperty"); }
public void SettingBaseTypeToNull_AlsoUpdatesBaseTypeConfigured() { var builder = new ODataModelBuilder(); var motorcycle = builder.AddEntity(typeof(Motorcycle)); var vehicle = builder.AddEntity(typeof(Vehicle)); motorcycle.DerivesFromNothing(); Assert.True(motorcycle.BaseTypeConfigured); }
public void HasConstraint_Throws_ReferentialConstraintAlreadyConfigured_Principal() { // Arrange PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("PrincipalKey1"); PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("DependentKey1"); PropertyInfo otherPrincipalPropertyInfo = typeof(Dependent).GetProperty("DependentKey2"); ODataModelBuilder builder = new ODataModelBuilder(); builder.AddEntity(typeof(Principal)); EntityTypeConfiguration dependentEntity = builder.AddEntity(typeof(Dependent)); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One, dependentEntity); navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo); // Act & Assert Assert.Throws<InvalidOperationException>( () => navigationProperty.HasConstraint(otherPrincipalPropertyInfo, principalPropertyInfo), String.Format(SRResources.ReferentialConstraintAlreadyConfigured, "principal", "PrincipalKey1", "dependent", "DependentKey1")); }
public void HasConstraint_Throws_DependentAndPrincipalTypeNotMatch() { // Arrange PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("PrincipalKey2"); PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("DependentKey1"); ODataModelBuilder builder = new ODataModelBuilder(); builder.AddEntity(typeof(Principal)); EntityTypeConfiguration dependentEntity = builder.AddEntity(typeof(Dependent)); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One, dependentEntity); // Act & Assert Assert.Throws<InvalidOperationException>( () => navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo), String.Format(SRResources.DependentAndPrincipalTypeNotMatch, "System.Int32", "System.String")); }
public void HasConstraint_Throws_ReferentialConstraintPropertyTypeNotValid() { // Arrange PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("MockPrincipal"); PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("MockDependent"); ODataModelBuilder builder = new ODataModelBuilder(); builder.AddEntity(typeof(Principal)); EntityTypeConfiguration dependentEntity = builder.AddEntity(typeof(Dependent)); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One, dependentEntity); // Act & Assert Assert.Throws<InvalidOperationException>( () => navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo), String.Format(SRResources.ReferentialConstraintPropertyTypeNotValid, "System.Web.Http.OData.MockType")); }
public void AddBinding_For_NavigationPropertyInHierarchy_Throws() { ODataModelBuilder builder = new ODataModelBuilder(); var vehicle = builder.AddEntity(typeof(Vehicle)); var motorcycle = builder.AddEntity(typeof(Motorcycle)); var manufacturer = builder.AddEntity(typeof(MotorcycleManufacturer)); var manufacturers = builder.AddEntitySet("manufacturers", manufacturer); var navProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.One); var vehicles = builder.AddEntitySet("vehicles", vehicle); Assert.ThrowsArgument( () => vehicles.AddBinding(navProperty, manufacturers), "navigationConfiguration", "The declaring entity type 'System.Web.Http.OData.Builder.TestModels.Motorcycle' of the given navigation property is not a part of the entity type 'System.Web.Http.OData.Builder.TestModels.Vehicle' hierarchy of the entity set 'vehicles'."); }
/// <summary> /// If a caller wants to tweak the <see cref="ODataModelBuilder"/>, this method can be used instead of <see cref="BuildEdmModel"/>, /// so that the caller can modify <paramref name="modelBuilder"/> before or after the entity sets are added. /// </summary> /// <param name="modelBuilder">An <see cref="ODataModelBuilder"/> or <see cref="ODataConventionModelBuilder"/>.</param> public virtual void ConfigureModelBuilder(ODataModelBuilder modelBuilder) { modelBuilder.ContainerName = _containerMetadata.Name; modelBuilder.Namespace = _containerMetadata.Namespace; // Add all entity types foreach (IEntityTypeMetadata entityTypeMetadata in _containerMetadata.EntityTypes) { EntityTypeConfiguration entityTypeConfig = modelBuilder.AddEntity(entityTypeMetadata.ClrType); } // Add all entity sets foreach (IEntitySetMetadata entitySetMetadata in _containerMetadata.EntitySets) { string entitySetName = entitySetMetadata.Name; EntityTypeConfiguration entityTypeConfig = (EntityTypeConfiguration) modelBuilder.GetTypeConfigurationOrNull(entitySetMetadata.ElementTypeMetadata.ClrType); EntitySetConfiguration entitySetConfig = modelBuilder.AddEntitySet(entitySetName, entityTypeConfig); } }