Пример #1
0
        public void GetEdmModel_ThrowsException_WithDifferentTypes()
        {
            // Arrange
            ODataModelBuilder builder = new ODataModelBuilder();

            builder.Entity <MultiUser>()
            .HasKey(u => new { u.UserId1, u.UserId2 });

            builder.Entity <MultiRole>()
            .HasRequired(r => r.User, (r, u) => r.UserKey2 == u.UserId2 && r.UserKey3 == u.UserId3);

            // Act & Assert
            Assert.Throws <InvalidOperationException>(
                () => builder.GetEdmModel(),
                String.Format(SRResources.DependentPropertiesNotMatchWithPrincipalKeys,
                              "System.String,System.Guid", "System.Int32,System.String"));
        }
        public void FailingToConfigureNavigationLinks_Results_In_InvalidOperationException_When_BuildingNavigationLink()
        {
            // Arrange
            ODataModelBuilder builder = new ODataModelBuilder();

            builder.EntitySet <EntitySetLinkConfigurationTest_Product>("Products").HasManyBinding(p => p.Orders, "Orders");
            var model = builder.GetEdmModel();

            IEdmEntitySet          products       = model.EntityContainers().Single().EntitySets().Single(s => s.Name == "Products");
            IEdmNavigationProperty ordersProperty = products.ElementType.DeclaredNavigationProperties().Single();
            var linkBuilder = model.GetEntitySetLinkBuilder(products);

            // Act & Assert
            Assert.Throws <InvalidOperationException>(
                () => linkBuilder.BuildNavigationLink(new EntityInstanceContext(), ordersProperty),
                "No NavigationLink factory was found for the navigation property 'Orders' from entity type 'System.Web.Http.OData.Builder.EntitySetLinkConfigurationTest_Product' on entity set 'Products'. " +
                "Try calling HasNavigationPropertyLink on the EntitySetConfiguration.");
        }
Пример #3
0
        public void BuilderIncludesMapFromEntityTypeToBindableProcedures()
        {
            // Arrange
            ODataModelBuilder builder = new ODataModelBuilder();
            EntityTypeConfiguration <Customer> customer = builder.EntitySet <Customer>("Customers").EntityType;

            customer.HasKey(c => c.Id);
            customer.Property(c => c.Name);
            customer.Action("Reward");
            IEdmModel      model        = builder.GetEdmModel();
            IEdmEntityType customerType = model.SchemaElements.OfType <IEdmEntityType>().SingleOrDefault();

            // Act
            BindableProcedureFinder finder = model.GetAnnotationValue <BindableProcedureFinder>(model);

            // Assert
            Assert.NotNull(finder);
            Assert.NotNull(finder.FindProcedures(customerType).SingleOrDefault());
            Assert.Equal("Reward", finder.FindProcedures(customerType).SingleOrDefault().Name);
        }
Пример #4
0
        public void GetEdmModel_PropertyWithDatabaseAttribute_CannotSetStoreGeneratedPatternOnComplexType()
        {
            // Arrange
            ODataModelBuilder builder = new ODataModelBuilder();

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

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

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

            Assert.Null(idAnnotation);
        }
Пример #5
0
        public void BuildNavigationLink(bool followsConventions, object metadataLevel, bool linkEmitted)
        {
            var       navigationProperty = _entitySet.EntityType.AddNavigationProperty(typeof(Customer).GetProperty("Orders"), EdmMultiplicity.Many);
            IEdmModel model = _modelBuilder.GetEdmModel();
            IEdmNavigationProperty edmNavProperty = model.GetEdmTypeReference(typeof(Customer)).AsEntity().DeclaredNavigationProperties().Single(p => p.Name == "Orders");

            EntitySetLinkBuilderAnnotation linkBuilder = new EntitySetLinkBuilderAnnotation(_entitySet);

            linkBuilder.AddNavigationPropertyLinkBuilder(edmNavProperty, new NavigationLinkBuilder((context, property) => new Uri("http://navigationlink"), followsConventions));

            Uri generatedNavigationLink = linkBuilder.BuildNavigationLink(new EntityInstanceContext(), edmNavProperty, (ODataMetadataLevel)metadataLevel);

            if (linkEmitted)
            {
                Assert.Equal("http://navigationlink/", generatedNavigationLink.AbsoluteUri);
            }
            else
            {
                Assert.Null(generatedNavigationLink);
            }
        }
        public void CanConfigureAllLinksViaEditLink()
        {
            // Arrange
            ODataModelBuilder builder = GetCommonModel();
            var expectedEditLink      = "http://server/service/Products(15)";

            var products = builder.EntitySet <EntitySetLinkConfigurationTest_Product>("Products");

            products.HasEditLink(c => new Uri(
                                     string.Format(
                                         "http://server/service/Products({0})",
                                         c.EntityInstance.ID
                                         )
                                     ));

            var actor           = builder.EntitySets.Single();
            var model           = builder.GetEdmModel();
            var productType     = model.SchemaElements.OfType <IEdmEntityType>().Single();
            var productsSet     = model.SchemaElements.OfType <IEdmEntityContainer>().Single().EntitySets().Single();
            var productInstance = new EntitySetLinkConfigurationTest_Product {
                ID = 15
            };
            var entityContext = new EntityInstanceContext {
                EdmModel = model, EntitySet = productsSet, EntityType = productType, EntityInstance = productInstance, UrlHelper = new UrlHelper(new HttpRequestMessage())
            };
            var entitySetLinkBuilderAnnotation = new EntitySetLinkBuilderAnnotation(actor);

            // Act
            var editLinkUri = entitySetLinkBuilderAnnotation.BuildEditLink(entityContext);
            var readLinkUri = entitySetLinkBuilderAnnotation.BuildReadLink(entityContext);
            var idLink      = entitySetLinkBuilderAnnotation.BuildIdLink(entityContext);

            // Assert
            Assert.NotNull(editLinkUri);
            Assert.Equal(expectedEditLink, editLinkUri.ToString());
            Assert.NotNull(readLinkUri);
            Assert.Equal(expectedEditLink, readLinkUri.ToString());
            Assert.NotNull(idLink);
            Assert.Equal(expectedEditLink, idLink);
        }
Пример #7
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);
        }
Пример #8
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));
        }
Пример #9
0
        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);
        }
Пример #10
0
        public void CanConfigureAllLinksViaIdLink()
        {
            // Arrange
            ODataModelBuilder builder = GetCommonModel();
            var expectedEditLink      = "http://server/service/Products(15)";

            var products = builder.EntitySet <EntitySetLinkConfigurationTest_Product>("Products");

            products.HasIdLink(c =>
                               string.Format(
                                   "http://server/service/Products({0})",
                                   c.GetPropertyValue("ID")
                                   ),
                               followsConventions: false);

            var actor           = builder.EntitySets.Single();
            var model           = builder.GetEdmModel();
            var productType     = model.SchemaElements.OfType <IEdmEntityType>().Single();
            var productsSet     = model.SchemaElements.OfType <IEdmEntityContainer>().Single().EntitySets().Single();
            var productInstance = new EntitySetLinkConfigurationTest_Product {
                ID = 15
            };
            var serializerContext = new ODataSerializerContext {
                Model = model, EntitySet = productsSet
            };
            var entityContext = new EntityInstanceContext(serializerContext, productType.AsReference(), productInstance);
            var entitySetLinkBuilderAnnotation = new EntitySetLinkBuilderAnnotation(actor);

            // Act
            var selfLinks = entitySetLinkBuilderAnnotation.BuildEntitySelfLinks(entityContext, ODataMetadataLevel.Default);

            // Assert
            Assert.NotNull(selfLinks.EditLink);
            Assert.Equal(expectedEditLink, selfLinks.EditLink.ToString());
            Assert.NotNull(selfLinks.ReadLink);
            Assert.Equal(expectedEditLink, selfLinks.ReadLink.ToString());
            Assert.NotNull(selfLinks.IdLink);
            Assert.Equal(expectedEditLink, selfLinks.IdLink);
        }
Пример #11
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);
        }
Пример #12
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);
        }
Пример #13
0
        public void GetEdmModel_SetsNullableIffParameterTypeIsNullable()
        {
            // Arrange
            ODataModelBuilder builder             = new ODataModelBuilder();
            EntityTypeConfiguration <Movie> movie = builder.EntitySet <Movie>("Movies").EntityType;
            var actionBuilder = movie.Action("Watch");

            actionBuilder.Parameter <int>("int");
            actionBuilder.Parameter <Nullable <int> >("nullableOfInt");
            actionBuilder.Parameter <DateTime>("dateTime");
            actionBuilder.Parameter <string>("string");

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

            //Assert
            IEdmEntityContainer container = model.SchemaElements.OfType <IEdmEntityContainer>().SingleOrDefault();
            IEdmFunctionImport  action    = container.FindFunctionImports("Watch").Single();

            Assert.False(action.FindParameter("int").Type.IsNullable);
            Assert.True(action.FindParameter("nullableOfInt").Type.IsNullable);
            Assert.False(action.FindParameter("dateTime").Type.IsNullable);
            Assert.True(action.FindParameter("string").Type.IsNullable);
        }