Exemple #1
0
        public void DerivesFrom_Throws_IfDerivedTypeHasKeys()
        {
            var builder = new ODataModelBuilder();

            Assert.Throws <InvalidOperationException>(
                () => builder
                .Entity <Motorcycle>()
                .HasKey(m => m.Model)
                .DerivesFrom <Vehicle>(),
                "Cannot define keys on type 'System.Web.Http.OData.Builder.TestModels.Motorcycle' deriving from 'System.Web.Http.OData.Builder.TestModels.Vehicle'. Only the root type in the entity inheritance hierarchy can contain keys.");
        }
Exemple #2
0
        public void DerivesFrom_Throws_WhenSettingTheBaseType_IfDuplicatePropertyInDerivedType()
        {
            var builder = new ODataModelBuilder();

            builder
            .Entity <Vehicle>()
            .Property(v => v.Model);

            builder
            .Entity <SportBike>()
            .DerivesFrom <Motorcycle>()
            .Property(c => c.Model);

            Assert.ThrowsArgument(
                () => builder
                .Entity <Motorcycle>()
                .DerivesFrom <Vehicle>(),
                "propertyInfo",
                "Cannot define property 'Model' in the base entity type 'System.Web.Http.OData.Builder.TestModels.Motorcycle' as the derived type 'System.Web.Http.OData.Builder.TestModels.SportBike' already defines it.");
        }
Exemple #3
0
        public void CannotDeriveFromItself()
        {
            var builder = new ODataModelBuilder();

            Assert.ThrowsArgument(
                () => builder
                .Entity <Vehicle>()
                .DerivesFrom <Vehicle>(),
                "baseType",
                "'System.Web.Http.OData.Builder.TestModels.Vehicle' does not inherit from 'System.Web.Http.OData.Builder.TestModels.Vehicle'.");
        }
Exemple #4
0
        public void DerivesFrom_Throws_IfDerivedTypeDoesNotDeriveFromBaseType()
        {
            var builder = new ODataModelBuilder();

            Assert.ThrowsArgument(
                () => builder
                .Entity <string>()
                .DerivesFrom <Vehicle>(),
                "baseType",
                "'System.String' does not inherit from 'System.Web.Http.OData.Builder.TestModels.Vehicle'.");
        }
Exemple #5
0
        public void SetNonPrimitiveProperty_ThrowsException()
        {
            // Arrange
            ODataModelBuilder builder = new ODataModelBuilder();

            // Act & Assert
            Assert.Throws <InvalidOperationException>(
                () => builder.Entity <ForeignEntity>().HasRequired(c => c.Principal,
                                                                   (c, r) => c.InvalidForeignKey == r.InvalidPrincipalKey),
                String.Format(SRResources.ReferentialConstraintPropertyTypeNotValid, "System.Web.Http.OData.MockType"));
        }
        public void CreateComplexTypeProperty()
        {
            var builder = new ODataModelBuilder().Add_Customer_EntityType().Add_Address_ComplexType();

            builder.Entity <Customer>().ComplexProperty(c => c.Address);
            var model           = builder.GetServiceModel();
            var customerType    = model.SchemaElements.OfType <IEdmEntityType>().Single();
            var addressProperty = customerType.FindProperty("Address");

            Assert.NotNull(addressProperty);
        }
Exemple #7
0
        public void ReturnsCollection_ThrowsInvalidOperationException_IfReturnTypeIsEntity()
        {
            // Arrange
            ODataModelBuilder builder = new ODataModelBuilder();

            builder.Entity <Movie>();
            var action = builder.Action("action");

            // Act & Assert
            Assert.Throws <InvalidOperationException>(() => action.ReturnsCollection <Movie>(),
                                                      "The EDM type 'System.Web.Http.OData.Builder.Movie' is already declared as an entity type. Use the " +
                                                      "method 'ReturnsCollectionFromEntitySet' if the return type is an entity collection.");
        }
Exemple #8
0
        public void CanCreateTransientAction()
        {
            ODataModelBuilder builder = new ODataModelBuilder();
            EntityTypeConfiguration <Customer> customer = builder.Entity <Customer>();

            customer.TransientAction("Reward");

            ProcedureConfiguration action = builder.Procedures.SingleOrDefault();

            Assert.NotNull(action);
            Assert.True(action.IsBindable);
            Assert.False(action.IsAlwaysBindable);
        }
Exemple #9
0
        public void GetEdmModel_Works_WithMultiForeignKeys()
        {
            // Arrange
            ODataModelBuilder builder = new ODataModelBuilder();
            EntityTypeConfiguration <MultiUser> userType = builder.Entity <MultiUser>();

            userType.HasKey(u => new { u.UserId1, u.UserId2 })
            .HasMany(u => u.Roles);

            EntityTypeConfiguration <MultiRole> roleType = builder.Entity <MultiRole>();

            roleType.HasKey(r => r.RoleId)
            .HasOptional(r => r.User, (r, u) => r.UserKey1 == u.UserId1 && r.UserKey2 == u.UserId2)
            .CascadeOnDelete();

            // Act
            IEdmModel model = builder.GetEdmModel();

            // Assert
            Assert.NotNull(model);
            IEdmEntityType roleEntityType = model.AssertHasEntityType(typeof(MultiRole));

            IEdmNavigationProperty usersNav = roleEntityType.AssertHasNavigationProperty(model, "User",
                                                                                         typeof(MultiUser), true, EdmMultiplicity.ZeroOrOne);

            Assert.Equal(EdmOnDeleteAction.Cascade, usersNav.OnDelete);

            Assert.Equal(2, usersNav.DependentProperties.Count());
            Assert.Equal("UserKey1", usersNav.DependentProperties.First().Name);
            Assert.Equal("UserKey2", usersNav.DependentProperties.Last().Name);

            IEdmProperty edmProperty = Assert.Single(roleEntityType.Properties().Where(c => c.Name == "UserKey1"));

            Assert.False(edmProperty.Type.IsNullable);

            edmProperty = Assert.Single(roleEntityType.Properties().Where(c => c.Name == "UserKey2"));
            Assert.False(edmProperty.Type.IsNullable);
        }
Exemple #10
0
        public void CanCreateAbstractEntityType()
        {
            var builder = new ODataModelBuilder();

            builder
            .Entity <Vehicle>()
            .Abstract();

            var model           = builder.GetEdmModel();
            var edmCustomerType = model.FindType(typeof(Vehicle).FullName) as IEdmEntityType;

            Assert.True(edmCustomerType != null);
            Assert.True(edmCustomerType.IsAbstract);
        }
Exemple #11
0
        public void GetEdmModel_PropertyWithConcurrency_IsConcurrencyToken()
        {
            // Arrange
            var builder = new ODataModelBuilder();

            builder.Entity <Customer>().Property(c => c.Name).IsConcurrencyToken();
            builder.Entity <Customer>().Property(c => c.Id);

            // Act
            var model = builder.GetEdmModel();

            // Assert
            IEdmEntityType         type         = model.AssertHasEntityType(typeof(Customer));
            IEdmStructuralProperty nameProperty =
                type.AssertHasPrimitiveProperty(model, "Name", EdmPrimitiveTypeKind.String, isNullable: true);

            Assert.Equal(EdmConcurrencyMode.Fixed, nameProperty.ConcurrencyMode);

            IEdmStructuralProperty idProperty =
                type.AssertHasPrimitiveProperty(model, "Id", EdmPrimitiveTypeKind.Int32, isNullable: false);

            Assert.Equal(EdmConcurrencyMode.None, idProperty.ConcurrencyMode);
        }
Exemple #12
0
        public void CreateStreamPrimitiveProperty()
        {
            ODataModelBuilder builder = new ODataModelBuilder();
            var file = builder.Entity <File>();
            var data = file.Property(f => f.StreamData);

            var model          = builder.GetServiceModel();
            var fileType       = model.SchemaElements.OfType <IEdmEntityType>().Single();
            var streamProperty = fileType.DeclaredProperties.SingleOrDefault(p => p.Name == "StreamData");

            Assert.Equal(PropertyKind.Primitive, data.Kind);

            Assert.NotNull(streamProperty);
            Assert.Equal("Edm.Stream", streamProperty.Type.FullName());
        }
        public void CanCreateActionThatBindsToEntityCollection()
        {
            // Arrange
            // Act
            ODataModelBuilder builder = new ODataModelBuilder();
            EntityTypeConfiguration <Customer> customer = builder.Entity <Customer>();
            ActionConfiguration sendEmail = customer.Collection.Action("SendEmail");

            // Assert
            Assert.True(sendEmail.IsBindable);
            Assert.NotNull(sendEmail.Parameters);
            Assert.Equal(1, sendEmail.Parameters.Count());
            Assert.Equal(BindingParameterConfiguration.DefaultBindingParameterName, sendEmail.Parameters.Single().Name);
            Assert.Equal(string.Format("Collection({0})", typeof(Customer).FullName), sendEmail.Parameters.Single().TypeConfiguration.FullName);
        }
Exemple #14
0
        public void ComplexCollections_Are_NotNullable_ByDefault()
        {
            var builder = new ODataModelBuilder();

            var property =
                builder
                .Entity <Customer>()
                .CollectionProperty(c => c.Addresses);

            var model = builder.GetEdmModel();

            Assert.False(property.OptionalProperty);
            var edmCustomer = model.AssertHasEntityType(typeof(Customer));

            Assert.False(edmCustomer.FindProperty("Addresses").Type.IsNullable);
        }
        public void NonbindingParameterConfigurationThrowsWhenParameterTypeIsEntity()
        {
            // Arrange
            ODataModelBuilder builder = new ODataModelBuilder();

            builder.Entity <Customer>();

            // Act & Assert
            ArgumentException exception = Assert.Throws <ArgumentException>(() =>
            {
                NonbindingParameterConfiguration configuration = new NonbindingParameterConfiguration("name", builder.GetTypeConfigurationOrNull(typeof(Customer)));
            });

            Assert.True(exception.Message.Contains(string.Format("'{0}'", typeof(Customer).FullName)));
            Assert.Equal("parameterType", exception.ParamName);
        }
Exemple #16
0
        public void CanCreateEntityWithCompoundKey()
        {
            var builder  = new ODataModelBuilder();
            var customer = builder.Entity <Customer>();

            customer.HasKey(c => new { c.CustomerId, c.Name });
            customer.Property(c => c.SharePrice);
            customer.Property(c => c.ShareSymbol);
            customer.Property(c => c.Website);

            var model        = builder.GetServiceModel();
            var customerType = model.FindType(typeof(Customer).FullName) as IEdmEntityType;

            Assert.Equal(5, customerType.Properties().Count());
            Assert.Equal(2, customerType.DeclaredKey.Count());
            Assert.NotNull(customerType.DeclaredKey.SingleOrDefault(k => k.Name == "CustomerId"));
            Assert.NotNull(customerType.DeclaredKey.SingleOrDefault(k => k.Name == "Name"));
        }
Exemple #17
0
        public void HasRequired_CanSetMultipleForeignKeyProperties_ForReferencialConstraint()
        {
            // Arrange
            ODataModelBuilder builder = new ODataModelBuilder();

            // Act
            NavigationPropertyConfiguration navigationProperty =
                builder.Entity <MultiRole>()
                .HasRequired(r => r.User, (r, u) => r.UserKey1 == u.UserId1 && r.UserKey2 == u.UserId2);

            // Assert
            Assert.Equal(2, navigationProperty.DependentProperties.Count());
            Assert.Same(typeof(MultiRole).GetProperty("UserKey1"), navigationProperty.DependentProperties.First());
            Assert.Same(typeof(MultiRole).GetProperty("UserKey2"), navigationProperty.DependentProperties.Last());

            Assert.Equal(2, navigationProperty.PrincipalProperties.Count());
            Assert.Same(typeof(MultiUser).GetProperty("UserId1"), navigationProperty.PrincipalProperties.First());
            Assert.Same(typeof(MultiUser).GetProperty("UserId2"), navigationProperty.PrincipalProperties.Last());
        }
Exemple #18
0
        public void GetEdmModel_PropertyWithDatabaseAttribute_SetStoreGeneratedPatternOnEntityType()
        {
            // Arrange
            ODataModelBuilder builder = new ODataModelBuilder();

            builder.Entity <Customer>().Property(c => c.Name).HasStoreGeneratedPattern(DatabaseGeneratedOption.Computed);

            // Act
            IEdmModel model = builder.GetEdmModel();

            // Assert
            IEdmEntityType         type     = model.AssertHasEntityType(typeof(Customer));
            IEdmStructuralProperty property = type.AssertHasPrimitiveProperty(model, "Name", EdmPrimitiveTypeKind.String, isNullable: true);
            var idAnnotation = model.GetAnnotationValue <EdmStringConstant>(
                property,
                StoreGeneratedPatternAnnotation.AnnotationsNamespace,
                StoreGeneratedPatternAnnotation.AnnotationName);

            Assert.Equal(DatabaseGeneratedOption.Computed.ToString(), idAnnotation.Value);
        }
        public NavigationPropertyBindingConfiguration HasManyBinding <TTargetType, TDerivedEntityType>(
            Expression <Func <TDerivedEntityType, IEnumerable <TTargetType> > > navigationExpression, string entitySetName)
            where TTargetType : class
            where TDerivedEntityType : class, TEntityType
        {
            if (navigationExpression == null)
            {
                throw Error.ArgumentNull("navigationExpression");
            }

            EntityTypeConfiguration <TDerivedEntityType> derivedEntityType =
                _modelBuilder.Entity <TDerivedEntityType>().DerivesFrom <TEntityType>();

            return(_configuration.AddBinding(derivedEntityType.HasMany(navigationExpression), _modelBuilder.EntitySet <TTargetType>(entitySetName)._configuration));
        }
Exemple #20
0
        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);
        }
Exemple #21
0
        public void CanDefinePropertyOnDerivedType_NotPresentInBaseEdmType_ButPresentInBaseClrType()
        {
            var builder = new ODataModelBuilder();

            builder
            .Entity <Motorcycle>()
            .DerivesFrom <Vehicle>()
            .Property(m => m.Model);

            var model = builder.GetEdmModel();

            var edmVehicle = model.AssertHasEntityType(typeof(Vehicle));

            Assert.Null(edmVehicle.BaseEntityType());
            Assert.Equal(0, edmVehicle.Properties().Count());

            var edmMotorcycle = model.AssertHasEntityType(typeof(Motorcycle));

            Assert.Equal(edmVehicle, edmMotorcycle.BaseEntityType());
            Assert.Equal(1, edmMotorcycle.Properties().Count());
            edmMotorcycle.AssertHasPrimitiveProperty(model, "Model", EdmPrimitiveTypeKind.Int32, isNullable: false);
        }
Exemple #22
0
        public void CanCreateEdmModel_WithTransientBindableAction()
        {
            // Arrange
            ODataModelBuilder builder = new ODataModelBuilder();
            EntityTypeConfiguration <Customer> customer = builder.Entity <Customer>();

            customer.HasKey(c => c.CustomerId);
            customer.Property(c => c.Name);
            // Act
            ActionConfiguration sendEmail = customer.TransientAction("ActionName");
            IEdmModel           model     = builder.GetEdmModel();

            // Assert
            IEdmEntityContainer container = model.EntityContainers().SingleOrDefault();

            Assert.NotNull(container);
            Assert.Equal(1, container.Elements.OfType <IEdmFunctionImport>().Count());
            IEdmFunctionImport action = container.Elements.OfType <IEdmFunctionImport>().Single();

            Assert.True(action.IsBindable);
            Assert.False(model.IsAlwaysBindable(action));
        }