public void CanAddNavigationLink_For_DerivedNavigationProperty() { ODataModelBuilder builder = ODataModelBuilderMocks.GetModelBuilderMock <ODataModelBuilder>(); var vehicle = builder.AddEntityType(typeof(Vehicle)); var motorcycle = builder.AddEntityType(typeof(Motorcycle)).DerivesFrom(vehicle); var manufacturer = builder.AddEntityType(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.EntityContainer.FindEntitySet("vehicles"); Assert.NotNull(model.GetNavigationSourceLinkBuilder(vehiclesEdmSet)); Assert.Equal( "http://works/", model.GetNavigationSourceLinkBuilder(vehiclesEdmSet).BuildNavigationLink(new ResourceContext(), edmNavProperty, ODataMetadataLevel.MinimalMetadata).AbsoluteUri); }
public void CreateModelUsingProgrammableApi() { var builder = new ODataModelBuilder(); var customerConfig = builder.AddEntityType(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.AddEntityType(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 meConfig = builder.AddSingleton("Me", customerConfig); 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.EntityContainer; Assert.NotNull(entityContainer); var customers = entityContainer.FindEntitySet("Customers"); Assert.NotNull(customers); Assert.Equal(typeof(Customer).FullName, customers.EntityType().FullName()); var orders = entityContainer.FindEntitySet("Orders"); Assert.NotNull(orders); Assert.Equal(typeof(Order).FullName, orders.EntityType().FullName()); var me = entityContainer.FindSingleton("Me"); Assert.NotNull(me); Assert.Equal(typeof(Customer).FullName, me.EntityType().FullName()); }
public static IEdmModel GetEdmModel() { //ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var builder = new ODataModelBuilder { Namespace = typeof(Person).Namespace, ContainerName = "DefaultContainer" }; ComplexTypeConfiguration <Range> rangeType = builder.ComplexType <Range>(); //rangeType.Select(); rangeType.Property(c => c.minValue); rangeType.Property(c => c.maxValue); var personConfig = builder.AddEntityType(typeof(Person)); personConfig.HasKey(typeof(Person).GetProperty("ID")); personConfig.AddProperty(typeof(Person).GetProperty("Name")); personConfig.AddNavigationProperty(typeof(Person).GetProperty("Car"), EdmMultiplicity.ZeroOrOne); //personConfig.AddComplexProperty(typeof(Person).GetProperty("minValue")); //personConfig.AddComplexProperty(typeof(Person).GetProperty("maxValue")); personConfig.AddComplexProperty(typeof(Person).GetProperty("Ranges")); var carConfig = builder.AddEntityType(typeof(Car)); carConfig.HasKey(typeof(Car).GetProperty("ID")); carConfig.AddProperty(typeof(Car).GetProperty("AmountMade")); carConfig.AddProperty(typeof(Car).GetProperty("APK")); carConfig.AddProperty(typeof(Car).GetProperty("Name")); carConfig.AddProperty(typeof(Car).GetProperty("TimeWhenAddedToDatabase")); carConfig.AddEnumProperty(typeof(Car).GetProperty("Brand")); carConfig.AddNavigationProperty(typeof(Car).GetProperty("People"), EdmMultiplicity.Many); var _Brands = builder.AddEnumType(typeof(_Brands)); _Brands.AddMember(Models._Brands.Audi); _Brands.AddMember(Models._Brands.BMW); _Brands.AddMember(Models._Brands.Ferrari); _Brands.AddMember(Models._Brands.Ford); _Brands.AddMember(Models._Brands.Honda); _Brands.AddMember(Models._Brands.Mercedes); _Brands.AddMember(Models._Brands.Mini); _Brands.AddMember(Models._Brands.Nissan); _Brands.AddMember(Models._Brands.Porsche); _Brands.AddMember(Models._Brands.Tesla); _Brands.AddMember(Models._Brands.Toyota); _Brands.AddMember(Models._Brands.Volkswagen); builder.AddEntitySet("people", personConfig); builder.AddEntitySet("cars", carConfig); var edmModel = builder.GetEdmModel(); //return builder.GetEdmModel(); return(edmModel); }
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 GetTargetNavigationSource_Returns_Null_IfMultipleMatchingTargetEntitySet() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration motorcycle = builder.AddEntityType(typeof(Motorcycle)); EntityTypeConfiguration manufacturer = builder.AddEntityType(typeof(MotorcycleManufacturer)); NavigationPropertyConfiguration navigationProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); EntitySetConfiguration manufacturers1 = builder.AddEntitySet("manufacturers1", manufacturer); EntitySetConfiguration manufacturers2 = builder.AddEntitySet("manufacturers2", manufacturer); // Act NavigationSourceConfiguration targetNavigationSource = AssociationSetDiscoveryConvention.GetTargetNavigationSource(navigationProperty, builder); // Assert Assert.Null(targetNavigationSource); }
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 AddBinding_For_NavigationPropertyInHierarchy_DoesnotThrows() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); var vehicle = builder.AddEntityType(typeof(Vehicle)); var motorcycle = builder.AddEntityType(typeof(Motorcycle)); var manufacturer = builder.AddEntityType(typeof(MotorcycleManufacturer)); var manufacturers = builder.AddEntitySet("manufacturers", manufacturer); var navProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.One); var vehicles = builder.AddEntitySet("vehicles", vehicle); // Act & Assert ExceptionAssert.DoesNotThrow(() => vehicles.AddBinding(navProperty, manufacturers)); }
public void AddNavigationLink_For_NavigationPropertyInHierarchy_Throws() { ODataModelBuilder builder = new ODataModelBuilder(); var vehicle = builder.AddEntityType(typeof(Vehicle)); var motorcycle = builder.AddEntityType(typeof(Motorcycle)); var manufacturer = builder.AddEntityType(typeof(MotorcycleManufacturer)); var manufacturers = builder.AddEntitySet("manufacturers", manufacturer); var navProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.One); var vehicles = builder.AddEntitySet("vehicles", vehicle); ExceptionAssert.ThrowsArgument( () => vehicles.HasNavigationPropertyLink(navProperty, new NavigationLinkBuilder((ctxt, property) => new Uri("http://works/"), followsConventions: false)), "navigationProperty", "The declaring entity type 'Microsoft.AspNet.OData.Test.Builder.TestModels.Motorcycle' " + "of the given navigation property is not a part of the entity type " + "'Microsoft.AspNet.OData.Test.Builder.TestModels.Vehicle' hierarchy of the entity set or singleton 'vehicles'."); }
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); }
static void RegisterCustomODataServiceModels(ODataModelBuilder builder) { IServiceManager serviceManager = Provider.ServiceManager(); Application[] apps = serviceManager.GetApplications(); object[] models = null; if (apps != null) { foreach (var app in apps) { if (app != null) { foreach (var service in app.Services) { try { //models = serviceManager.GetEntityModels(service, app); if (service.ServiceType == ServiceType.Custom) { models = serviceManager.GetEntityModels(service); } //models = serviceManager.GetEntityModels(service); } catch (Exception ex) { models = null; } if (models != null) { foreach (var model in models) { if (model is IODataEntityModel <ODataModelBuilder> ) { //(model as IODataEntityModel<ODataModelBuilder>).Register(builder); //builder.AddEntitySet(model.GetType().Name + "s", builder.AddEntityType(model.GetType())); builder.AddEntitySet(model.GetType().Name, builder.AddEntityType(model.GetType())); } } } } } } } }
public void CanAddBinding_For_DerivedNavigationProperty() { // Arrange ODataModelBuilder builder = ODataModelBuilderMocks.GetModelBuilderMock <ODataModelBuilder>(); var vehicle = builder.AddEntityType(typeof(Vehicle)); var motorcycle = builder.AddEntityType(typeof(Motorcycle)).DerivesFrom(vehicle); var manufacturer = builder.AddEntityType(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); // Act IEdmModel model = builder.GetEdmModel(); // Assert var motorcycleEdmType = model.AssertHasEntityType(typeof(Motorcycle)); var edmNavProperty = motorcycleEdmType.AssertHasNavigationProperty(model, "Manufacturer", typeof(MotorcycleManufacturer), isNullable: false, multiplicity: EdmMultiplicity.One); IEdmEntitySet entitySet = model.EntityContainer.FindEntitySet("vehicles"); Assert.NotNull(entitySet); var target = entitySet.FindNavigationTarget(edmNavProperty); Assert.NotNull(target); Assert.Equal("manufacturers", target.Name); var binding = Assert.Single(entitySet.FindNavigationPropertyBindings(edmNavProperty)); Assert.Same(target, binding.Target); Assert.Equal("Microsoft.AspNet.OData.Test.Builder.TestModels.Motorcycle/Manufacturer", binding.Path.Path); }
// TODO: customize the way the key is identified private void AddEntityType(ODataModelBuilder builder, Type type) { var properties = type.GetProperties(); var key = properties.Where(p => p.PropertyType == typeof(Guid)).FirstOrDefault(); if (key == null) { key = properties.First(); } var edmSetConfig = builder.AddEntitySet(type.Name, new EntityTypeConfiguration(builder, type)); var edmTypeConfig = builder.AddEntityType(type); edmTypeConfig.HasKey(key); }
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 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 BuildEdmType(TypeData type) { if (!EdmTypeBuilder.TryBuild(type, out var edmType) || !(edmType is EntityTypeConfiguration entityType)) { return; } if (type.TryGetAttribute <EntitySetAttribute>(out var entitySetAttribute)) { _oDataModelBuilder.AddEntitySet(entitySetAttribute.Name, entityType); } else if (type.TryGetAttribute <SingletonTypeAttribute>(out var singletonTypeAttribute)) { _oDataModelBuilder.AddSingleton(singletonTypeAttribute.Name, entityType); } }
public void CreateEdmModel_WithSingleton_CanAddBindingPath_ToNavigationProperty_WithComplex() { // Arrange ODataModelBuilder builder = ODataModelBuilderMocks.GetModelBuilderMock <ODataModelBuilder>(); var motorcycle = builder.AddEntityType(typeof(Motorcycle)); var myMotor = builder.AddSingleton("MyMotor", motorcycle); var manufacturer = builder.AddComplexType(typeof(MotorcycleManufacturer)); var address = builder.AddEntityType(typeof(ManufacturerAddress)); motorcycle.AddComplexProperty(typeof(Motorcycle).GetProperty("Manufacturer")); var navProperty = manufacturer.AddNavigationProperty(typeof(Manufacturer).GetProperty("Address"), EdmMultiplicity.One); var addresses = builder.AddEntitySet("Addresses", address); myMotor.AddBinding(navProperty, addresses, new List <MemberInfo> { typeof(Motorcycle).GetProperty("Manufacturer"), typeof(Manufacturer).GetProperty("Address") }); // Act IEdmModel model = builder.GetEdmModel(); // Assert var motorcycleEdmType = model.AssertHasEntityType(typeof(Motorcycle)); Assert.Empty(motorcycleEdmType.NavigationProperties()); var manufacturerEdmType = model.AssertHasComplexType(typeof(MotorcycleManufacturer)); var edmNavProperty = manufacturerEdmType.AssertHasNavigationProperty(model, "Address", typeof(ManufacturerAddress), isNullable: false, multiplicity: EdmMultiplicity.One); var myMotorSingleton = model.EntityContainer.FindSingleton("MyMotor"); Assert.NotNull(myMotorSingleton); var bindings = myMotorSingleton.FindNavigationPropertyBindings(edmNavProperty); var binding = Assert.Single(bindings); Assert.Equal("Address", binding.NavigationProperty.Name); Assert.Equal("Addresses", binding.Target.Name); Assert.Equal("Manufacturer/Address", binding.Path.Path); }
public void GetTargetNavigationSource_Returns_BaseTypeNavigationSource_IfNoMatchingEntitysetForCurrentType() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration motorcycle = builder.AddEntityType(typeof(Motorcycle)); EntityTypeConfiguration manufacturer = builder.AddEntityType(typeof(Manufacturer)); EntityTypeConfiguration motorcycleManufacturer = builder.AddEntityType(typeof(MotorcycleManufacturer)).DerivesFrom(manufacturer); NavigationPropertyConfiguration navigationProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); EntitySetConfiguration manufacturers = builder.AddEntitySet("manufacturers", manufacturer); // Act NavigationSourceConfiguration targetNavigationSource = AssociationSetDiscoveryConvention.GetTargetNavigationSource(navigationProperty, builder); // Assert Assert.Same(manufacturers, targetNavigationSource); }
/// <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 HasNavigationPropertyLink_CanReplaceExistingLinks() { // Arrange var entity = _builder.AddEntityType(typeof(Motorcycle)); var navigationProperty = entity.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.One); var entityset = _builder.AddEntitySet("vehicles", entity); Uri link1 = new Uri("http://link1"); Uri link2 = new Uri("http://link2"); entityset.HasNavigationPropertyLink(navigationProperty, new NavigationLinkBuilder((entityContext, property) => link1, followsConventions: true)); // Act entityset.HasNavigationPropertyLink(navigationProperty, new NavigationLinkBuilder((entityContext, property) => link2, followsConventions: false)); // Assert var navigationLink = entityset.GetNavigationPropertyLink(navigationProperty); Assert.False(navigationLink.FollowsConventions); Assert.Equal(link2, navigationLink.Factory(null, null)); }
static EntitySetConfiguration CreateEntitySet(XPClassInfo classInfo, ODataModelBuilder builder) { EntitySetConfiguration entitySetConfig = builder.EntitySets.FirstOrDefault(t => t.EntityType.ClrType == classInfo.ClassType); if (entitySetConfig != null) { return(entitySetConfig); } EntityTypeConfiguration entityTypeConfig = builder.AddEntityType(classInfo.ClassType); entitySetConfig = builder.AddEntitySet(classInfo.ClassType.Name, entityTypeConfig); if (classInfo.PersistentBaseClass != null) { EntitySetConfiguration baseClassEntitySetConfig = CreateEntitySet(classInfo.PersistentBaseClass, builder); entityTypeConfig.DerivesFrom(baseClassEntitySetConfig.EntityType); } else { if (classInfo.KeyProperty is ReflectionFieldInfo) { foreach (XPMemberInfo mi in classInfo.Members) { if (mi.IsAliased) { string aliasedExpr = ((PersistentAliasAttribute)mi.GetAttributeInfo(typeof(PersistentAliasAttribute))).AliasExpression; var aliasedCriteria = CriteriaOperator.Parse(aliasedExpr) as OperandProperty; if (!ReferenceEquals(null, aliasedCriteria) && aliasedCriteria.PropertyName == classInfo.KeyProperty.Name) { entityTypeConfig.HasKey(classInfo.ClassType.GetProperty(mi.Name)); break; } } } } else { entityTypeConfig.HasKey(classInfo.ClassType.GetProperty(classInfo.KeyProperty.Name)); } } return(entitySetConfig); }
public void Apply_AddsNavigationLinkFor_AllBaseDeclaredAndDerivedProperties() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration vehicle = builder.AddEntityType(typeof(Vehicle)); EntityTypeConfiguration car = builder.AddEntityType(typeof(Car)).DerivesFrom(vehicle); NavigationPropertyConfiguration carNavigationProperty = car.AddNavigationProperty(typeof(Car).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); EntityTypeConfiguration motorcycle = builder.AddEntityType(typeof(Motorcycle)).DerivesFrom(vehicle); NavigationPropertyConfiguration motorcycleNavigationProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); EntityTypeConfiguration manufacturer = builder.AddEntityType(typeof(Manufacturer)); EntityTypeConfiguration motorcycleManufacturer = builder.AddEntityType(typeof(MotorcycleManufacturer)).DerivesFrom(manufacturer); EntityTypeConfiguration carManufacturer = builder.AddEntityType(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(); }
static EntitySetConfiguration CreateEntitySet(XPClassInfo classInfo, ODataModelBuilder builder) { EntitySetConfiguration entitySetConfig = builder.EntitySets.FirstOrDefault(t => t.EntityType.ClrType == classInfo.ClassType); if (entitySetConfig != null) { return(entitySetConfig); } EntityTypeConfiguration entityTypeConfig = builder.AddEntityType(classInfo.ClassType); entitySetConfig = builder.AddEntitySet(classInfo.ClassType.Name, entityTypeConfig); if (classInfo.PersistentBaseClass != null) { EntitySetConfiguration baseClassEntitySetConfig = CreateEntitySet(classInfo.PersistentBaseClass, builder); entityTypeConfig.DerivesFrom(baseClassEntitySetConfig.EntityType); } else { entityTypeConfig.HasKey(classInfo.ClassType.GetProperty(classInfo.KeyProperty.Name)); } return(entitySetConfig); }
public void Apply_AddsNavigationLinkFor_AllBaseDeclaredAndDerivedProperties() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration vehicle = builder.AddEntityType(typeof(Vehicle)); EntityTypeConfiguration car = builder.AddEntityType(typeof(Car)).DerivesFrom(vehicle); NavigationPropertyConfiguration carNavigationProperty = car.AddNavigationProperty(typeof(Car).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); EntityTypeConfiguration motorcycle = builder.AddEntityType(typeof(Motorcycle)).DerivesFrom(vehicle); NavigationPropertyConfiguration motorcycleNavigationProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); EntityTypeConfiguration manufacturer = builder.AddEntityType(typeof(Manufacturer)); EntityTypeConfiguration motorcycleManufacturer = builder.AddEntityType(typeof(MotorcycleManufacturer)).DerivesFrom(manufacturer); EntityTypeConfiguration carManufacturer = builder.AddEntityType(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(ODataModelBuilder builder, ApiVersion apiVersion) { var p = typeof(Infrastructure.Enums.Role).GetProperties(); _context.GetDbSets().ForEach(entityType => { if (entityType.IsEnum) { var name = entityType.Name;//entityType.GetAttribute<DescriptionAttribute>().Description ?? entityType.Name; if (builder.EnumTypes.FirstOrDefault(k => k.Name == name) == null) { builder.AddEnumType(entityType); } } else if (builder.EntitySets.FirstOrDefault(k => k.Name == entityType.Name) == null) { var primaryKeys = _context.ModelBuilder.Value.Entity(entityType).Metadata.FindPrimaryKey() ?.Properties ?.Select(m => m.PropertyInfo) ?.ToList() ?? entityType.GetProperties().Take(1).ToList() ?? throw new ArgumentNullException(); if (primaryKeys != null) { var entity = builder.AddEntitySet(entityType.Name, builder.AddEntityType(entityType)).EntityType; primaryKeys.ForEach(primaryKey => entity.HasKey(primaryKey)); } /*else if (builder.StructuralTypes.FirstOrDefault(k => k.Name == entityType.Name) == null) * { * builder.AddComplexType(entityType); * }*/ } }); }
public void GetTargetEntitySet_Returns_TargetEntitySet() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration motorcycle = builder.AddEntity(typeof(Motorcycle)); EntityTypeConfiguration manufacturer = builder.AddEntity(typeof(MotorcycleManufacturer)); 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 EntitySetLinkBuilderAnnotationTest() { _modelBuilder = new ODataModelBuilder(); _entitySet = _modelBuilder.AddEntitySet("Customers", _modelBuilder.AddEntity(typeof(Customer))); }
public void CreateModelusingProgrammableApi() { var builder = new ODataModelBuilder(); var customerConfig = builder.AddEntityType(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.AddEntityType(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 meConfig = builder.AddSingleton("Me", customerConfig); 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.Single(customerType.NavigationProperties()); 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.EntityContainer; Assert.NotNull(entityContainer); var customers = entityContainer.FindEntitySet("Customers"); Assert.NotNull(customers); Assert.Equal(typeof(Customer).FullName, customers.EntityType().FullName()); var orders = entityContainer.FindEntitySet("Orders"); Assert.NotNull(orders); Assert.Equal(typeof(Order).FullName, orders.EntityType().FullName()); var me = entityContainer.FindSingleton("Me"); Assert.NotNull(me); Assert.Equal(typeof(Customer).FullName, me.EntityType().FullName()); }
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 GetTargetNavigationSource_Returns_BaseTypeNavigationSource_IfNoMatchingEntitysetForCurrentType() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration motorcycle = builder.AddEntityType(typeof(Motorcycle)); EntityTypeConfiguration manufacturer = builder.AddEntityType(typeof(Manufacturer)); EntityTypeConfiguration motorcycleManufacturer = builder.AddEntityType(typeof(MotorcycleManufacturer)).DerivesFrom(manufacturer); NavigationPropertyConfiguration navigationProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); EntitySetConfiguration manufacturers = builder.AddEntitySet("manufacturers", manufacturer); // Act NavigationSourceConfiguration targetNavigationSource = AssociationSetDiscoveryConvention.GetTargetNavigationSource(navigationProperty, builder); // Assert Assert.Same(manufacturers, targetNavigationSource); }
public NavigationSourceLinkBuilderAnnotationTest() { _modelBuilder = ODataModelBuilderMocks.GetModelBuilderMock <ODataModelBuilder>(); _entitySet = _modelBuilder.AddEntitySet("Customers", _modelBuilder.AddEntityType(typeof(Customer))); }
public void GetTargetNavigationSource_Returns_Null_IfMultipleMatchingTargetEntitySet() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration motorcycle = builder.AddEntityType(typeof(Motorcycle)); EntityTypeConfiguration manufacturer = builder.AddEntityType(typeof(MotorcycleManufacturer)); NavigationPropertyConfiguration navigationProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.ZeroOrOne); EntitySetConfiguration manufacturers1 = builder.AddEntitySet("manufacturers1", manufacturer); EntitySetConfiguration manufacturers2 = builder.AddEntitySet("manufacturers2", manufacturer); // Act NavigationSourceConfiguration targetNavigationSource = AssociationSetDiscoveryConvention.GetTargetNavigationSource(navigationProperty, builder); // Assert Assert.Null(targetNavigationSource); }
public NavigationSourceLinkBuilderAnnotationTest() { _modelBuilder = ODataModelBuilderMocks.GetModelBuilderMock<ODataModelBuilder>(); _entitySet = _modelBuilder.AddEntitySet("Customers", _modelBuilder.AddEntityType(typeof(Customer))); }
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); } }