Exemple #1
0
        private static IEdmModel GetEdmModel()
        {
            var builder = new ODataConventionModelBuilder();

            builder.EnumType <Color>().Namespace = "NS";
            return(builder.GetEdmModel());
        }
Exemple #2
0
        public void CreateODataEnumValue_ReturnsCorrectEnumMember()
        {
            // Arrange
            var builder = new ODataConventionModelBuilder();

            builder.EnumType <BookCategory>().Namespace = "NS";
            IEdmModel    model    = builder.GetEdmModel();
            IEdmEnumType enumType = model.SchemaElements.OfType <IEdmEnumType>().Single();

            IServiceProvider serviceProvder = new Mock <IServiceProvider>().Object;
            var provider = new DefaultODataSerializerProvider(serviceProvder);
            ODataEnumSerializer    serializer   = new ODataEnumSerializer(provider);
            ODataSerializerContext writeContext = new ODataSerializerContext
            {
                Model = model
            };

            // Act
            ODataEnumValue value = serializer.CreateODataEnumValue(BookCategory.Newspaper,
                                                                   new EdmEnumTypeReference(enumType, false), writeContext);

            // Assert
            Assert.NotNull(value);
            Assert.Equal("news", value.Value);
        }
Exemple #3
0
        public async Task ReadFromStreamAsync_ModelAlias()
        {
            // Arrange
            string content = "{\"@odata.type\":\"#NS.level\",\"value\":\"veryhigh\"}";

            var builder = new ODataConventionModelBuilder();

            builder.EnumType <Level>().Namespace = "NS";
            IEdmModel model = builder.GetEdmModel();

            ODataEnumDeserializer    deserializer = new ODataEnumDeserializer();
            ODataDeserializerContext readContext  = new ODataDeserializerContext
            {
                Model        = model,
                ResourceType = typeof(Level)
            };

            HttpRequest request = RequestFactory.Create("Post", "http://localhost/", _edmModel);

            // Act
            object value = await deserializer.ReadAsync(ODataTestUtil.GetODataMessageReader(request.GetODataMessage(content), model),
                                                        typeof(Level), readContext);

            // Assert
            Level level = Assert.IsType <Level>(value);

            Assert.Equal(Level.High, level);
        }
        public static void ConfigureSecurityService(this IAppBuilder app)
        {
            Debug.Assert(app != null);

            //// build EDM model

            var builder = new ODataConventionModelBuilder()
            {
                Namespace = typeof(UsersController).Namespace,
                ContainerName = "DefaultContainer"
            };

            builder.EnumType<Role>();
            // TODO: how to mark the entity set as readonly
            var userEntityType = builder.EntitySet<User>("Users").EntityType;
            userEntityType.Ignore(c => c._Password);
            userEntityType.Ignore(c => c._IsLocked);
            userEntityType.Ignore(c => c._LockDateTimeUtc);

            var edmModel = builder.GetEdmModel();

            //// configure web API

            var config = new HttpConfiguration() { IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always };
            config.MessageHandlers.Add(new ETagMessageHandler());
            config.MapODataServiceRoute("SecurityService", "securityservice", edmModel);
            config.Services.Replace(typeof(IHttpControllerSelector), new ClientHttpControllerSelector(config, typeof(SecurityServiceHelper)));
            config.EnsureInitialized();

            app.UseWebApi(config);
        }
        private static IEdmModel GetEdmModel()
        {
            ODataConventionModelBuilder builder = ODataConventionModelBuilderFactory.Create();

            builder.EnumType <Color>().Namespace = "NS";
            return(builder.GetEdmModel());
        }
        public void ReadSource_CanReadDynamicPropertiesForInheritanceOpenEntityType()
        {
            // Arrange
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

            builder.EntityType <SimpleOpenCustomer>();
            builder.EnumType <SimpleEnum>();
            IEdmModel model = builder.GetEdmModel();

            IEdmEntityTypeReference vipCustomerTypeReference = model.GetEdmTypeReference(typeof(SimpleVipCustomer)).AsEntity();

            var deserializer = new ODataResourceDeserializer(_deserializerProvider);

            ODataResource resource = new ODataResource
            {
                Properties = new[]
                {
                    // declared properties
                    new ODataProperty {
                        Name = "CustomerId", Value = 121
                    },
                    new ODataProperty {
                        Name = "Name", Value = "VipName #121"
                    },
                    new ODataProperty {
                        Name = "VipNum", Value = "Vip Num 001"
                    },

                    // dynamic properties
                    new ODataProperty {
                        Name = "GuidProperty", Value = new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA")
                    },
                },
                TypeName = typeof(SimpleVipCustomer).FullName
            };

            ODataDeserializerContext readContext = new ODataDeserializerContext()
            {
                Model = model
            };

            ODataResourceWrapper resourceWrapper = new ODataResourceWrapper(resource);

            // Act
            SimpleVipCustomer customer = deserializer.ReadResource(resourceWrapper, vipCustomerTypeReference, readContext)
                                         as SimpleVipCustomer;

            // Assert
            Assert.NotNull(customer);

            // Verify the declared properties
            Assert.Equal(121, customer.CustomerId);
            Assert.Equal("VipName #121", customer.Name);
            Assert.Equal("Vip Num 001", customer.VipNum);

            // Verify the dynamic properties
            Assert.NotNull(customer.CustomerProperties);
            Assert.Equal(1, customer.CustomerProperties.Count());
            Assert.Equal(new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA"), customer.CustomerProperties["GuidProperty"]);
        }
Exemple #7
0
        public ODataEnumDeserializerTests()
        {
            var builder = new ODataConventionModelBuilder();

            builder.EnumType <Color>().Namespace = "NS";
            _edmModel = builder.GetEdmModel();
        }
        public static void ConfigureSsisService(this IAppBuilder app)
        {
            Debug.Assert(app != null);

            //// build EDM model

            var builder = new ODataConventionModelBuilder()
            {
                Namespace = typeof(SsisController).Namespace,
                ContainerName = "DefaultContainer"
            };

            builder.ComplexType<JobParameter>();
            builder.ComplexType<JobStatusResult>();
            builder.EnumType<JobStatus>();
            builder.EnumType<JobParameterType>();

            {
                var function = builder.Function("GetStatus");
                function.Parameter<string>("name").OptionalParameter = false;
                function.Returns<JobStatusResult>();
            }

            {
                var action = builder.Action("Run");
                action.Parameter<string>("name").OptionalParameter = false;
                action.CollectionParameter<JobParameter>("parameters").OptionalParameter = false;
                action.Returns<string>();
            }

            {
                var action = builder.Action("Stop");
                action.Parameter<string>("name").OptionalParameter = false;
                action.Returns<string>();
            }

            var edmModel = builder.GetEdmModel();

            //// configure web API

            var config = new HttpConfiguration() { IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always };
            config.MapODataServiceRoute("SsisService", "ssisservice", edmModel);
            config.Services.Replace(typeof(IHttpControllerSelector), new ClientHttpControllerSelector(config, typeof(SsisServiceHelper)));
            config.EnsureInitialized();

            app.UseWebApi(config);
        }
        public static void ConfigureSalesService(this IAppBuilder app)
        {
            Debug.Assert(app != null);

            //// build EDM model

            var builder = new ODataConventionModelBuilder()
            {
                Namespace = typeof(SalesController).Namespace,
                ContainerName = "DefaultContainer"
            };

            builder.EnumType<ContactMethod>();
            builder.EnumType<SaleStatus>();

            {
                var entityType = builder.EntityType<Contact>();
                entityType.Ignore(c => c._SaleHeaderId);
                entityType.Ignore(c => c._SaleHeader);
            }

            {
                var entityType = builder.EntityType<SaleLineItem>();
                entityType.Ignore(c => c._DynamicProperties);
                entityType.Ignore(c => c._SaleHeaderId);
                entityType.Ignore(c => c._SaleHeader);
            }

            {
                builder.EntitySet<SaleHeader>("Sales");
            }

            var edmModel = builder.GetEdmModel();

            //// configure web API

            var config = new HttpConfiguration() { IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always };
            config.MessageHandlers.Add(new ETagMessageHandler());
            config.MapODataServiceRoute("SalesService", "salesservice", edmModel);
            config.Services.Replace(typeof(IHttpControllerSelector), new ClientHttpControllerSelector(config, typeof(SaleServiceHelper)));
            config.EnsureInitialized();

            app.UseWebApi(config);
        }
Exemple #10
0
        private IEdmModel GetEdmModel()
        {
            var builder = new ODataConventionModelBuilder
            {
                Namespace = "API"
            };

            builder.EnumType <BibleVersion>();
            builder.EnumType <BookList>();

            builder.EntitySet <Book>("Books");
            builder.EntitySet <Bible>("Bibles");
            builder.EntitySet <BibleBook>("BibleBooks");
            builder.EntitySet <Verse>("Verses");
            //builder.EntityType<Bible>().ContainsMany(x => x.Chapters);
            //builder.EntityType<Chapter>().ContainsMany(x => x.Verses);

            return(builder.GetEdmModel());
        }
Exemple #11
0
        public static IEdmModel GetModel(WebRouteConfiguration config)
        {
            ODataConventionModelBuilder builder = config.CreateConventionModelBuilder();

            builder.EntitySet <Item>("Items");
            builder.EntitySet <Item2>("Items2");
            builder.EntitySet <ItemWithEnum>("ItemsWithEnum");
            builder.EntitySet <ItemWithoutColumn>("ItemsWithoutColumn");
            builder.EnumType <SmallNumber>();
            return(builder.GetEdmModel());
        }
Exemple #12
0
        public static IEdmModel GetEdmModel()
        {
            if (_edmModel != null)
            {
                return(_edmModel);
            }


            var builder = new ODataConventionModelBuilder();

            builder.EntitySet <Customer>("Customers");
            builder.EnumType <Appliance>();
            builder.EnumType <Color>();
            builder.EnumType <Permission>();
            _edmModel = builder.GetEdmModel();

            AppendAnnotation(_edmModel);
            AppendAnnotationForPermission(_edmModel);
            return(_edmModel);
        }
Exemple #13
0
        public static IEdmModel GetEdmModel()
        {
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

            builder.EntitySet <Item>("Items");
            builder.EntitySet <Item2>("Items2");
            builder.EntitySet <ItemWithEnum>("ItemsWithEnum");
            builder.EntitySet <ItemWithoutColumn>("ItemsWithoutColumn");
            builder.EnumType <SmallNumber>();
            return(builder.GetEdmModel());
        }
Exemple #14
0
        private IEdmModel GetEdmModel()
        {
            var builder = new ODataConventionModelBuilder();

            builder.EnumType <Genre>();
            builder.ComplexType <Address>();
            builder.ComplexType <NextOfKin>();
            builder.EntitySet <Director>("Directors");

            return(builder.GetEdmModel());
        }
Exemple #15
0
        private static IEdmModel GetEdmModel()
        {
            var builder = new ODataConventionModelBuilder();

            builder.EntitySet <Customer>("Customers");
            builder.ComplexType <Address>();
            builder.EnumType <Color>();

            BuildFunction(builder);
            BuildAction(builder);
            return(builder.GetEdmModel());
        }
Exemple #16
0
        public static IEdmModel GetEdmModel()
        {
            var builder = new ODataConventionModelBuilder();

            builder.EntitySet <Customer>("Customers");
            builder.EntitySet <Order>("Orders");
            builder.EnumType <CustomerType>();
            builder.EntityType <Customer>().Collection.Function("EnumFunction").Returns <Enum>();
            IEdmModel model = builder.GetEdmModel();

            return(model);
        }
Exemple #17
0
        private static IEdmModel GetModel()
        {
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

            builder.EntitySet <Account>("Accounts");
            builder.EnumType <Gender>();

            builder.Namespace = typeof(Account).Namespace;

            var edmModel = builder.GetEdmModel();

            return(edmModel);
        }
Exemple #18
0
        public static IEdmModel GetModel()
        {
            if (_edmModel == null)
            {
                ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
                builder.EntitySet <Account>("Accounts");
                builder.EnumType <Gender>();

                builder.Namespace = typeof(Account).Namespace;

                _edmModel = builder.GetEdmModel();
            }

            return(_edmModel);
        }
        public static IEdmModel GetTypedConventionModel()
        {
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

            builder.EntitySet<Employee>("Employees");
            builder.EntitySet<Account>("Accounts");

            builder.EnumType<Gender>();

            AddBoundActionsAndFunctions(builder.EntityType<Account>());
            AddUnboundActionsAndFunctions(builder);

            builder.Namespace = typeof(Account).Namespace;

            return builder.GetEdmModel();
        }
        public static IEdmModel GetTypedConventionModel()
        {
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

            builder.EntitySet <Employee>("Employees");
            builder.EntitySet <Account>("Accounts");

            builder.EnumType <Gender>();

            AddBoundActionsAndFunctions(builder.EntityType <Account>());
            AddUnboundActionsAndFunctions(builder);

            builder.Namespace = typeof(Account).Namespace;

            return(builder.GetEdmModel());
        }
Exemple #21
0
        public static IEdmModel NewConventionalBuildModel()
        {
            var builder = new ODataConventionModelBuilder();

            builder.EnumType <Color>();
            builder.ComplexType <Address>();
            builder.EntityType <Order>();
            builder.EntityType <Customer>();
            builder.EntityType <Registration>().HasKey(r => new { r.ParticipantId, r.ThreadId });
            builder.EntityType <Participant>().HasKey(p => p.Login);
            builder.EntityType <Thread>().HasKey(t => t.Id);
            builder.EntityType <Box>().HasKey(b => b.Id);
            builder.EntitySet <Thread>("Threads");
            builder.EntitySet <Box>("Boxes");
            builder.EntitySet <Participant>("Participants");
            return(builder.GetEdmModel());
        }
Exemple #22
0
        private IEdmModel GetModel()
        {
            ODataConventionModelBuilder builder = ODataConventionModelBuilderFactory.Create();
            var set = builder.EntitySet <SelectExpandTestCustomer>("SelectExpandTestCustomers");

            builder.EntitySet <SelectExpandTestOrder>("SelectExpandTestOrders");
            var set2 = builder.EntitySet <SelectExpandTestCustomerWithCustom>("SelectExpandTestCustomerWithCustoms");

            builder.Ignore <SelectExpandTestSpecialCustomer>();
            builder.Ignore <SelectExpandTestSpecialOrder>();

            set.EntityType.Function("GetBestOrders").ReturnsCollectionFromEntitySet <SelectExpandTestOrder>("SelectExpandTestOrders");
            set2.EntityType.Function("GetInstanceBestOrders").ReturnsCollectionFromEntitySet <SelectExpandTestOrder>("SelectExpandTestOrders");
            set2.EntityType.Function("GetInt").Returns <int>().Parameter <int>("p");
            set2.EntityType.Function("ConvertEnum").Returns <int>().Parameter <TestEnum>("p");
            builder.EnumType <TestEnum>();

            var model = builder.GetEdmModel();

            var entityType        = model.EntityContainer.EntitySets().First(e => e.Name == "SelectExpandTestCustomerWithCustoms").EntityType() as EdmEntityType;
            var containerProperty = typeof(SelectExpandTestCustomerWithCustom).GetProperty(nameof(SelectExpandTestCustomerWithCustom.Custom));
            var clrProperty       = containerProperty.PropertyType.GetProperty(nameof(CustomFields.TestField));


            var edmProperty = entityType.AddStructuralProperty("TestField", EdmPrimitiveTypeKind.String, true);

            model.SetAnnotationValue(edmProperty, new ClrPropertyInfoAnnotation(clrProperty)
            {
                PropertiesPath = new List <PropertyInfo>()
                {
                    containerProperty
                }
            });

            var modelBound = model.GetAnnotationValue <ModelBoundQuerySettings>(entityType) ?? new ModelBoundQuerySettings();

            modelBound.DefaultSelectType = SelectExpandType.Automatic;
            modelBound.MaxTop            = null; // Ensure that system wide settings are respected
            model.SetAnnotationValue(entityType, modelBound);

            BoundFunctions.RegisterFunctions(model.SchemaElements.OfType <EdmEnumType>().First(e => e.Name == "TestEnum").ToEdmTypeReference(false));

            return(model);
        }
        public static IEdmModel GetEdmModel()
        {
            var modelBuilder = new ODataConventionModelBuilder();

            modelBuilder.EntitySet <KnowledgeItem>("KnowledgeItems");
            modelBuilder.EntitySet <ExerciseItem>("ExerciseItems");
            modelBuilder.EntitySet <ExerciseItemAnswer>("ExerciseItemAnswers");
            modelBuilder.EntitySet <KnowledgeTag>("KnowledgeTags");
            modelBuilder.EntitySet <ExerciseTag>("ExerciseTags");
            modelBuilder.EnumType <AwardRuleType>();
            modelBuilder.EntitySet <AwardRule>("AwardRules");
            modelBuilder.EntitySet <DailyTrace>("DailyTraces");
            modelBuilder.EntitySet <AwardPoint>("AwardPoints");
            modelBuilder.EntitySet <AwardPointReport>("AwardPointReports");
            modelBuilder.EntitySet <Tag>("Tags");
            modelBuilder.EntitySet <TagCount>("TagCounts");
            modelBuilder.EntitySet <TagCountByRefType>("TagCountByRefTypes");
            modelBuilder.EntitySet <OverviewInfo>("OverviewInfos");
            modelBuilder.EntitySet <ExerciseItemWithTagView>("ExerciseItemWithTagViews");
            modelBuilder.EntitySet <KnowledgeItemWithTagView>("KnowledgeItemWithTagViews");

            // Action on Daily trace template documents
            var awardPointEntity = modelBuilder.EntityType <AwardPoint>();

            awardPointEntity.Property(prop => prop.RecordDate).AsDate();
            var dailyTraceEntity = modelBuilder.EntityType <DailyTrace>();

            dailyTraceEntity.Property(prop => prop.RecordDate).AsDate();
            var simulatePointAction = dailyTraceEntity.Collection.Action("SimulatePoints");

            simulatePointAction.Parameter <DailyTrace>("dt");
            simulatePointAction.ReturnsCollectionFromEntitySet <AwardPoint>("AwardPoints");
            //.Parameter<DailyTrace>("dt");

            modelBuilder.Namespace = typeof(KnowledgeItem).Namespace;

            return(modelBuilder.GetEdmModel());
        }
Exemple #24
0
        private static IEdmModel GetModel()
        {
            var builder = new ODataConventionModelBuilder {
                Namespace = Namespace
            };

            builder.EnumType <Issue.IssueStatus>().Namespace = Namespace;

            var soissue = builder.EntityType <SOIssue>();

            soissue.Namespace = Namespace;
            soissue.Ignore(p => p.Type);
            soissue.Ignore(p => p.Tag);

            var user = builder.EntityType <User>();

            user.Namespace = Namespace;
            user.HasKey(p => p.Name);

            builder.EntitySet <SOIssue>("SOIssues");
            builder.EntitySet <User>("Users");
            return(builder.GetEdmModel());
        }
        public static void ConfigureProductService(this IAppBuilder app)
        {
            Debug.Assert(app != null);

            //// build EDM model

            var builder = new ODataConventionModelBuilder()
            {
                Namespace = typeof(ProductController).Namespace,
                ContainerName = "DefaultContainer"
            };

            builder.EnumType<ProductDiamondClarity>();
            builder.EnumType<ProductDiamondColor>();
            builder.EnumType<ProductDiamondCut>();
            builder.EnumType<ProductDiamondPolish>();
            builder.EnumType<ProductDiamondReport>();
            builder.EnumType<ProductDiamondSymmetry>();
            builder.EnumType<ProductStatus>();
            builder.EntitySet<ProductDiamondImport>("DiamondImports");

            {
                var entityType = builder.EntitySet<ProductDiamond>("Diamonds").EntityType;
                entityType.Ignore(c => c._Import);
                entityType.Ignore(c => c._ImportId);
            }

            var edmModel = builder.GetEdmModel();

            //// configure web API

            var config = new HttpConfiguration() { IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always };
            config.MessageHandlers.Add(new ETagMessageHandler());
            config.MapODataServiceRoute("ProductService", "productservice", edmModel);
            config.Services.Replace(typeof(IHttpControllerSelector), new ClientHttpControllerSelector(config, typeof(ProductServiceHelper)));
            config.EnsureInitialized();

            app.UseWebApi(config);
        }
            public static Microsoft.OData.Edm.IEdmModel GetEdmModel()
            {
                var modelBuilder = new ODataConventionModelBuilder();

                modelBuilder.ContainerName = "storageApi";
                modelBuilder.Namespace     = "container";

                modelBuilder.EnableLowerCamelCase();

                #region ENTITY SETS

                var expenseEntitySet = modelBuilder.EntitySet <Expense>("expenses");

                var incomeEntitySet = modelBuilder.EntitySet <Income>("incomes");

                var usersEntitySet = modelBuilder.EntitySet <User>("users");

                #endregion

                #region ENTITY TYPES

                var expenseEntityType = modelBuilder.EntityType <Expense>();
                expenseEntityType.Namespace = DefaultTypeNameSpace;
                expenseEntityType.Name      = Camelize(expenseEntityType.Name);
                expenseEntityType.HasKey <int>(x => x.ExpenseId);

                var incomeEntityType = modelBuilder.EntityType <Income>();
                incomeEntityType.Namespace = DefaultTypeNameSpace;
                incomeEntityType.Name      = Camelize(incomeEntityType.Name);
                incomeEntityType.HasKey <int>(i => i.Id);
                incomeEntityType.Property(i => i.UserId);
                incomeEntityType.Property(i => i.Amount);

                var userEntityType = modelBuilder.EntityType <User>();
                userEntityType.Namespace = DefaultTypeNameSpace;
                userEntityType.Name      = Camelize(userEntityType.Name);
                userEntityType.HasKey <int>(x => x.Id);

                #endregion

                #region COMPLEX TYPES

                var chartComplexType = modelBuilder.ComplexType <Chart>();
                chartComplexType.Name      = Camelize(chartComplexType.Name);
                chartComplexType.Namespace = DefaultTypeNameSpace;
                chartComplexType.Property(x => x.Amount).IsRequired();

                var monthlyChartComplexType = modelBuilder.ComplexType <MonthlyChart>();
                monthlyChartComplexType.Name      = Camelize(monthlyChartComplexType.Name);
                monthlyChartComplexType.Namespace = DefaultTypeNameSpace;
                monthlyChartComplexType.Property(x => x.Name).IsRequired();

                var expenseChartSummaryComplexType = modelBuilder.ComplexType <ChartSummary>();
                expenseChartSummaryComplexType.Name      = Camelize(expenseChartSummaryComplexType.Name);
                expenseChartSummaryComplexType.Namespace = DefaultTypeNameSpace;

                #endregion

                #region ENUM TYPES

                var chartTypeEnumType = modelBuilder.EnumType <ChartType>();
                chartTypeEnumType.Name      = Camelize(chartTypeEnumType.Name);
                chartTypeEnumType.Namespace = DefaultTypeNameSpace;

                #endregion

                #region  ACTIONS

                #region EXPENSE

                #endregion

                #endregion

                #region FUNCTIONS

                var getYearlySummaryFunction = expenseEntityType.Collection.Function("yearlySummary");
                getYearlySummaryFunction.Namespace = "get";
                getYearlySummaryFunction.Parameter <int>("userId").OptionalParameter          = false;
                getYearlySummaryFunction.Parameter <int>("noOfLatestYears").OptionalParameter = true;
                getYearlySummaryFunction.ReturnsCollection <Chart>().OptionalReturn           = false;

                var getMonthlySummaryFunction = expenseEntityType.Collection.Function("monthlySummary");
                getMonthlySummaryFunction.Namespace = "get";
                getMonthlySummaryFunction.Parameter <int>("userId").OptionalParameter = false;
                getMonthlySummaryFunction.Parameter <int>("year").OptionalParameter   = false;
                getMonthlySummaryFunction.Returns <ChartSummary>().OptionalReturn     = false;

                var getWeeklySummaryFunction = expenseEntityType.Collection.Function("weeklySummary");
                getWeeklySummaryFunction.Namespace = "get";
                getWeeklySummaryFunction.Parameter <int>("userId").OptionalParameter = false;
                getWeeklySummaryFunction.Parameter <int>("year").OptionalParameter   = false;
                getWeeklySummaryFunction.Parameter <int>("month").OptionalParameter  = false;
                getWeeklySummaryFunction.ReturnsCollection <Chart>().OptionalReturn  = false;


                var getInomesByFunction = incomeEntityType.Collection.Function("chartData");
                getInomesByFunction.Namespace = "get";
                getInomesByFunction.Parameter <int>("userId").OptionalParameter      = false;
                getInomesByFunction.Parameter <ChartType>("type").OptionalParameter  = false;
                getInomesByFunction.Parameter <string>("typeData").OptionalParameter = false;
                getInomesByFunction.Returns <ChartSummary>().OptionalReturn          = true;


                var filterUsersByFunction = userEntityType.Function("by");
                filterUsersByFunction.Namespace = "filter";
                filterUsersByFunction.Parameter <string>("type").OptionalParameter = false;
                filterUsersByFunction.Returns <bool>();

                #endregion

                return(modelBuilder.GetEdmModel());
            }
        public void ReadComplexValue_CanReadDynamicCollectionPropertiesForOpenComplexType()
        {
            // Arrange
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            builder.ComplexType<SimpleOpenAddress>();
            builder.EnumType<SimpleEnum>();
            IEdmModel model = builder.GetEdmModel();
            IEdmComplexTypeReference addressTypeReference =
                model.GetEdmTypeReference(typeof(SimpleOpenAddress)).AsComplex();

            var deserializerProvider = new DefaultODataDeserializerProvider();
            var deserializer = new ODataComplexTypeDeserializer(deserializerProvider);

            ODataEnumValue enumValue = new ODataEnumValue("Third", typeof(SimpleEnum).FullName);

            ODataCollectionValue collectionValue = new ODataCollectionValue
            {
                TypeName = "Collection(" + typeof(SimpleEnum).FullName + ")",
                Items = new[] { enumValue, enumValue }
            };

            ODataComplexValue complexValue = new ODataComplexValue
            {
                Properties = new[]
                {
                    // declared properties
                    new ODataProperty { Name = "Street", Value = "My Way #599" },

                    // dynamic properties
                    new ODataProperty { Name = "CollectionProperty", Value = collectionValue }
                },
                TypeName = typeof(SimpleOpenAddress).FullName
            };

            ODataDeserializerContext readContext = new ODataDeserializerContext()
            {
                Model = model
            };

            // Act
            SimpleOpenAddress address = deserializer.ReadComplexValue(complexValue, addressTypeReference, readContext)
                as SimpleOpenAddress;

            // Assert
            Assert.NotNull(address);

            // Verify the declared properties
            Assert.Equal("My Way #599", address.Street);
            Assert.Null(address.City);

            // Verify the dynamic properties
            Assert.NotNull(address.Properties);
            Assert.Equal(1, address.Properties.Count());

            var collectionValues = Assert.IsType<List<SimpleEnum>>(address.Properties["CollectionProperty"]);
            Assert.NotNull(collectionValues);
            Assert.Equal(2, collectionValues.Count());
            Assert.Equal(SimpleEnum.Third, collectionValues[0]);
            Assert.Equal(SimpleEnum.Third, collectionValues[1]);
        }
Exemple #28
0
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.EnvironmentName == "Development")
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

#if DEBUG
#else
            app.UseSerilogRequestLogging();
#endif

            // app.UseHttpsRedirection();
            app.UseAuthentication();
            if (Environment.EnvironmentName != "IntegrationTest")
            {
                app.UseCors(MyAllowSpecificOrigins);
            }

            ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(app.ApplicationServices);
            modelBuilder.EntitySet <Currency>("Currencies");
            modelBuilder.EntitySet <Language>("Languages");
            modelBuilder.EntitySet <DBVersion>("DBVersions");
            modelBuilder.EntitySet <CheckVersionResult>("CheckVersionResult");
            modelBuilder.EnumType <HomeMemberRelationType>();
            modelBuilder.EntitySet <HomeDefine>("HomeDefines");
            modelBuilder.EntitySet <HomeMember>("HomeMembers");
            modelBuilder.EntitySet <LearnCategory>("LearnCategories");
            modelBuilder.EntitySet <LearnObject>("LearnObjects");
            modelBuilder.EntitySet <FinanceAccountCategory>("FinanceAccountCategories");
            modelBuilder.EntitySet <FinanceAssetCategory>("FinanceAssetCategories");
            modelBuilder.EntitySet <FinanceDocumentType>("FinanceDocumentTypes");
            modelBuilder.EntitySet <FinanceTransactionType>("FinanceTransactionTypes");
            modelBuilder.EnumType <FinanceAccountStatus>();
            modelBuilder.EnumType <RepeatFrequency>();
            modelBuilder.EnumType <LoanRepaymentMethod>();
            modelBuilder.EnumType <FinancePlanTypeEnum>();
            modelBuilder.EntitySet <FinanceControlCenter>("FinanceControlCenters");
            modelBuilder.EntitySet <FinanceAccount>("FinanceAccounts");
            modelBuilder.EntitySet <FinanceAccountExtraDP>("FinanceAccountExtraDPs");
            modelBuilder.EntitySet <FinanceAccountExtraAS>("FinanceAccountExtraASs");
            modelBuilder.EntitySet <FinanceTmpDPDocument>("FinanceTmpDPDocuments");
            modelBuilder.EntitySet <FinanceTmpLoanDocument>("FinanceTmpLoanDocuments");
            modelBuilder.EntitySet <FinanceOrder>("FinanceOrders");
            modelBuilder.EntitySet <FinanceOrderSRule>("FinanceOrderSRules");
            modelBuilder.EntitySet <FinancePlan>("FinancePlans");
            modelBuilder.EntitySet <FinanceDocument>("FinanceDocuments");
            modelBuilder.EntitySet <FinanceDocumentItem>("FinanceDocumentItems");
            modelBuilder.EntitySet <FinanceDocumentItemView>("FinanceDocumentItemViews");
            var acntBalRpt = modelBuilder.EntitySet <FinanceReportByAccount>("FinanceReportByAccounts");
            acntBalRpt.EntityType.HasKey(p => new {
                p.HomeID,
                p.AccountID,
            });
            var ccBalRpt = modelBuilder.EntitySet <FinanceReportByControlCenter>("FinanceReportByControlCenters");
            ccBalRpt.EntityType.HasKey(p => new
            {
                p.HomeID,
                p.ControlCenterID,
            });
            var ordBalRpt = modelBuilder.EntitySet <FinanceReportByOrder>("FinanceReportByOrders");
            ordBalRpt.EntityType.HasKey(p => new
            {
                p.HomeID,
                p.OrderID,
            });
            modelBuilder.ComplexType <RepeatedDates>();
            modelBuilder.ComplexType <RepeatDatesCalculationInput>();
            modelBuilder.ComplexType <RepeatedDatesWithAmount>();
            modelBuilder.ComplexType <RepeatDatesWithAmountCalculationInput>();
            // Function on root
            modelBuilder.Function("GetRepeatedDates")
            .ReturnsCollection <RepeatedDates>();
//                .Parameter<RepeatDatesCalculationInput>("input");
            var funcbuilder = modelBuilder.Function("GetRepeatedDates2")
                              .ReturnsCollection <RepeatedDates>();
            funcbuilder.Parameter <string>("StartDate");
            funcbuilder.Parameter <string>("EndDate");
            funcbuilder.Parameter <int>("RepeatType");
            modelBuilder.Function("GetRepeatedDatesWithAmount")
            .ReturnsCollection <RepeatedDatesWithAmount>();
            //.Parameter<RepeatDatesWithAmountCalculationInput>("input");
            modelBuilder.Function("GetRepeatedDatesWithAmountAndInterest")
            .ReturnsCollection <RepeatedDatesWithAmountAndInterest>();
            //.Parameter<RepeatDatesWithAmountAndInterestCalInput>("input");
            // Actions on Documents
            var docEntity = modelBuilder.EntityType <FinanceDocument>();
            docEntity.Property(c => c.TranDate).AsDate();
            docEntity.Collection
            .Action("PostDPDocument")
            .ReturnsFromEntitySet <FinanceDocument>("FinanceDocuments");
            //.Returns<FinanceDocument>();
            //.Parameter<int>("HomeID");
            docEntity.Collection
            .Action("PostLoanDocument")
            .ReturnsFromEntitySet <FinanceDocument>("FinanceDocuments");
//              .Parameter<int>("HomeID");
            docEntity.Collection
            .Action("PostAssetBuyDocument")
            .ReturnsFromEntitySet <FinanceDocument>("FinanceDocuments");
            //.Parameter<int>("HomeID");
            docEntity.Collection
            .Action("PostAssetSellDocument")
            .ReturnsFromEntitySet <FinanceDocument>("FinanceDocuments");
            //.Parameter<int>("HomeID");
            docEntity.Collection
            .Action("PostAssetValueChangeDocument")
            .ReturnsFromEntitySet <FinanceDocument>("FinanceDocuments");
            modelBuilder.Namespace = typeof(Currency).Namespace;
            // Function on DP template documents
            var tmpTpDocEntity   = modelBuilder.EntityType <FinanceTmpDPDocument>();
            var tmpTpDocPostFunc =
                tmpTpDocEntity.Collection.Action("PostDocument")
                .ReturnsFromEntitySet <FinanceDocument>("FinanceDocuments");
            //tmpTpDocPostFunc.Parameter<int>("DocumentID");
            //tmpTpDocPostFunc.Parameter<int>("AccountID");
            //tmpTpDocPostFunc.Parameter<int>("HomeID");
            // Action on Loan template documents: Repay document
            var tmpLoanDocEntity = modelBuilder.EntityType <FinanceTmpLoanDocument>();
            tmpLoanDocEntity.Collection
            .Action("PostRepayDocument")
            .ReturnsFromEntitySet <FinanceDocument>("FinanceDocuments");
            tmpLoanDocEntity.Collection
            .Action("PostPrepaymentDocument")
            .ReturnsFromEntitySet <FinanceDocument>("FinanceDocuments");
            modelBuilder.EntitySet <BlogFormat>("BlogFormats");
            modelBuilder.EntitySet <BlogUserSetting>("BlogUserSettings");
            modelBuilder.EntitySet <BlogCollection>("BlogCollections");
            modelBuilder.EntitySet <BlogPost>("BlogPosts");
            modelBuilder.EntitySet <BlogPostCollection>("BlogPostCollections");
            modelBuilder.EntitySet <BlogPostTag>("BlogPostTags");
            // Functions
            var postentity = modelBuilder.EntityType <BlogPost>();
            postentity.Function("Deploy")
            .Returns <string>()
            ;
            postentity.Function("ClearDeploy")
            .Returns <string>();
            var blogsetting = modelBuilder.EntityType <BlogUserSetting>();
            blogsetting.Function("Deploy")
            .Returns <string>();

            var model = modelBuilder.GetEdmModel();
            app.UseODataBatching();

            app.UseMiddleware(typeof(ErrorHandlingMiddleware));

            app.UseMvc(routeBuilder => {
                // and this line to enable OData query option, for example $filter
                routeBuilder.Select().Expand().Filter().OrderBy().MaxTop(100).Count();

                routeBuilder.MapODataServiceRoute("ODataRoute", "api", model);
            });

            app.UseResponseCaching();

            var cachePeriod = env.EnvironmentName == "Development" ? "10" : "30";
            app.UseStaticFiles(new StaticFileOptions
            {
                FileProvider      = new PhysicalFileProvider(BlogFolder),
                RequestPath       = "/blogs",
                OnPrepareResponse = ctx =>
                {
                    // Requires the following import:
                    // using Microsoft.AspNetCore.Http;
                    ctx.Context.Response.Headers.Append("Cache-Control", $"public, max-age={cachePeriod}");
                }
            });
        }
        public void ReadEntry_CanReadDynamicPropertiesForOpenEntityType()
        {
            // Arrange
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntityType<SimpleOpenCustomer>();
            builder.EnumType<SimpleEnum>();
            IEdmModel model = builder.GetEdmModel();

            IEdmEntityTypeReference customerTypeReference = model.GetEdmTypeReference(typeof(SimpleOpenCustomer)).AsEntity();

            var deserializerProvider = new DefaultODataDeserializerProvider();
            var deserializer = new ODataEntityDeserializer(deserializerProvider);

            ODataEnumValue enumValue = new ODataEnumValue("Third", typeof(SimpleEnum).FullName);

            ODataComplexValue[] complexValues =
            {
                new ODataComplexValue
                {
                    TypeName = typeof(SimpleOpenAddress).FullName,
                    Properties = new[]
                    {
                        // declared properties
                        new ODataProperty { Name = "Street", Value = "Street 1" },
                        new ODataProperty { Name = "City", Value = "City 1" },

                        // dynamic properties
                        new ODataProperty
                        {
                            Name = "DateTimeProperty",
                            Value = new DateTimeOffset(new DateTime(2014, 5, 6))
                        }
                    }
                },
                new ODataComplexValue
                {
                    TypeName = typeof(SimpleOpenAddress).FullName,
                    Properties = new[]
                    {
                        // declared properties
                        new ODataProperty { Name = "Street", Value = "Street 2" },
                        new ODataProperty { Name = "City", Value = "City 2" },

                        // dynamic properties
                        new ODataProperty
                        {
                            Name = "ArrayProperty",
                            Value = new ODataCollectionValue { TypeName = "Collection(Edm.Int32)", Items = new[] {1, 2, 3, 4} }
                        }
                    }
                }
            };

            ODataCollectionValue collectionValue = new ODataCollectionValue
            {
                TypeName = "Collection(" + typeof(SimpleOpenAddress).FullName + ")",
                Items = complexValues
            };

            ODataEntry odataEntry = new ODataEntry
            {
                Properties = new[]
                {
                    // declared properties
                    new ODataProperty { Name = "CustomerId", Value = 991 },
                    new ODataProperty { Name = "Name", Value = "Name #991" },

                    // dynamic properties
                    new ODataProperty { Name = "GuidProperty", Value = new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA") },
                    new ODataProperty { Name = "EnumValue", Value = enumValue },
                    new ODataProperty { Name = "CollectionProperty", Value = collectionValue }
                },
                TypeName = typeof(SimpleOpenCustomer).FullName
            };

            ODataDeserializerContext readContext = new ODataDeserializerContext()
            {
                Model = model
            };

            ODataEntryWithNavigationLinks entry = new ODataEntryWithNavigationLinks(odataEntry);

            // Act
            SimpleOpenCustomer customer = deserializer.ReadEntry(entry, customerTypeReference, readContext)
                as SimpleOpenCustomer;

            // Assert
            Assert.NotNull(customer);

            // Verify the declared properties
            Assert.Equal(991, customer.CustomerId);
            Assert.Equal("Name #991", customer.Name);

            // Verify the dynamic properties
            Assert.NotNull(customer.CustomerProperties);
            Assert.Equal(3, customer.CustomerProperties.Count());
            Assert.Equal(new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA"), customer.CustomerProperties["GuidProperty"]);
            Assert.Equal(SimpleEnum.Third, customer.CustomerProperties["EnumValue"]);

            // Verify the dynamic collection property
            var collectionValues = Assert.IsType<List<SimpleOpenAddress>>(customer.CustomerProperties["CollectionProperty"]);
            Assert.NotNull(collectionValues);
            Assert.Equal(2, collectionValues.Count());

            Assert.Equal(new DateTimeOffset(new DateTime(2014, 5, 6)), collectionValues[0].Properties["DateTimeProperty"]);
            Assert.Equal(new List<int> { 1, 2, 3, 4 }, collectionValues[1].Properties["ArrayProperty"]);
        }
        public void ReadComplexValue_CanReadDynamicPropertiesForOpenComplexType()
        {
            // Arrange
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            builder.ComplexType<SimpleOpenAddress>();
            builder.EnumType<SimpleEnum>();
            IEdmModel model = builder.GetEdmModel();
            IEdmComplexTypeReference addressTypeReference = model.GetEdmTypeReference(typeof(SimpleOpenAddress)).AsComplex();

            var deserializerProvider = new Mock<ODataDeserializerProvider>().Object;
            var deserializer = new ODataComplexTypeDeserializer(deserializerProvider);

            ODataEnumValue enumValue = new ODataEnumValue("Third", typeof(SimpleEnum).FullName);

            ODataComplexValue complexValue = new ODataComplexValue
            {
                Properties = new[]
                {
                    // declared properties
                    new ODataProperty { Name = "Street", Value = "My Way #599" },
                    new ODataProperty { Name = "City", Value = "Redmond & Shanghai" },

                    // dynamic properties
                    new ODataProperty { Name = "GuidProperty", Value = new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA") },
                    new ODataProperty { Name = "EnumValue", Value = enumValue },
                    new ODataProperty { Name = "DateTimeProperty", Value = new DateTimeOffset(new DateTime(1992, 1, 1)) }
                },
                TypeName = typeof(SimpleOpenAddress).FullName
            };

            ODataDeserializerContext readContext = new ODataDeserializerContext()
            {
                Model = model
            };

            // Act
            SimpleOpenAddress address = deserializer.ReadComplexValue(complexValue, addressTypeReference, readContext)
                as SimpleOpenAddress;

            // Assert
            Assert.NotNull(address);

            // Verify the declared properties
            Assert.Equal("My Way #599", address.Street);
            Assert.Equal("Redmond & Shanghai", address.City);

            // Verify the dynamic properties
            Assert.NotNull(address.Properties);
            Assert.Equal(3, address.Properties.Count());
            Assert.Equal(new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA"), address.Properties["GuidProperty"]);
            Assert.Equal(SimpleEnum.Third, address.Properties["EnumValue"]);
            Assert.Equal(new DateTimeOffset(new DateTime(1992, 1, 1)), address.Properties["DateTimeProperty"]);
        }
        public void ReadResource_CanReadDynamicPropertiesForOpenEntityType()
        {
            // Arrange
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

            builder.EntityType <SimpleOpenCustomer>();
            builder.EnumType <SimpleEnum>();
            IEdmModel model = builder.GetEdmModel();

            IEdmEntityTypeReference customerTypeReference = model.GetEdmTypeReference(typeof(SimpleOpenCustomer)).AsEntity();

            var deserializer = new ODataResourceDeserializer(_deserializerProvider);

            ODataEnumValue enumValue = new ODataEnumValue("Third", typeof(SimpleEnum).FullName);

            ODataResource[] complexResources =
            {
                new ODataResource
                {
                    TypeName   = typeof(SimpleOpenAddress).FullName,
                    Properties = new[]
                    {
                        // declared properties
                        new ODataProperty {
                            Name = "Street", Value = "Street 1"
                        },
                        new ODataProperty {
                            Name = "City", Value = "City 1"
                        },

                        // dynamic properties
                        new ODataProperty
                        {
                            Name  = "DateTimeProperty",
                            Value = new DateTimeOffset(new DateTime(2014, 5, 6))
                        }
                    }
                },
                new ODataResource
                {
                    TypeName   = typeof(SimpleOpenAddress).FullName,
                    Properties = new[]
                    {
                        // declared properties
                        new ODataProperty {
                            Name = "Street", Value = "Street 2"
                        },
                        new ODataProperty {
                            Name = "City", Value = "City 2"
                        },

                        // dynamic properties
                        new ODataProperty
                        {
                            Name  = "ArrayProperty",
                            Value = new ODataCollectionValue{
                                TypeName = "Collection(Edm.Int32)", Items = new[]{                                         1, 2, 3, 4 }.Cast <object>()
                            }
                        }
                    }
                }
            };

            ODataResource odataResource = new ODataResource
            {
                Properties = new[]
                {
                    // declared properties
                    new ODataProperty {
                        Name = "CustomerId", Value = 991
                    },
                    new ODataProperty {
                        Name = "Name", Value = "Name #991"
                    },

                    // dynamic properties
                    new ODataProperty {
                        Name = "GuidProperty", Value = new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA")
                    },
                    new ODataProperty {
                        Name = "EnumValue", Value = enumValue
                    },
                },
                TypeName = typeof(SimpleOpenCustomer).FullName
            };

            ODataDeserializerContext readContext = new ODataDeserializerContext()
            {
                Model = model
            };

            ODataResourceWrapper topLevelResourceWrapper = new ODataResourceWrapper(odataResource);

            ODataNestedResourceInfo resourceInfo = new ODataNestedResourceInfo
            {
                IsCollection = true,
                Name         = "CollectionProperty"
            };
            ODataNestedResourceInfoWrapper resourceInfoWrapper = new ODataNestedResourceInfoWrapper(resourceInfo);
            ODataResourceSetWrapper        resourceSetWrapper  = new ODataResourceSetWrapper(new ODataResourceSet
            {
                TypeName = String.Format("Collection({0})", typeof(SimpleOpenAddress).FullName)
            });

            foreach (var complexResource in complexResources)
            {
                resourceSetWrapper.Resources.Add(new ODataResourceWrapper(complexResource));
            }
            resourceInfoWrapper.NestedItems.Add(resourceSetWrapper);
            topLevelResourceWrapper.NestedResourceInfos.Add(resourceInfoWrapper);

            // Act
            SimpleOpenCustomer customer = deserializer.ReadResource(topLevelResourceWrapper, customerTypeReference, readContext)
                                          as SimpleOpenCustomer;

            // Assert
            Assert.NotNull(customer);

            // Verify the declared properties
            Assert.Equal(991, customer.CustomerId);
            Assert.Equal("Name #991", customer.Name);

            // Verify the dynamic properties
            Assert.NotNull(customer.CustomerProperties);
            Assert.Equal(3, customer.CustomerProperties.Count());
            Assert.Equal(new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA"), customer.CustomerProperties["GuidProperty"]);
            Assert.Equal(SimpleEnum.Third, customer.CustomerProperties["EnumValue"]);

            // Verify the dynamic collection property
            var collectionValues = Assert.IsType <List <SimpleOpenAddress> >(customer.CustomerProperties["CollectionProperty"]);

            Assert.NotNull(collectionValues);
            Assert.Equal(2, collectionValues.Count());

            Assert.Equal(new DateTimeOffset(new DateTime(2014, 5, 6)), collectionValues[0].Properties["DateTimeProperty"]);
            Assert.Equal(new List <int> {
                1, 2, 3, 4
            }, collectionValues[1].Properties["ArrayProperty"]);
        }
        public void ODataConventionModelBuilder_DataContractAttribute_AllowsReferencingSameEnumTwice()
        {
            // Arrange
            var builder = new ODataConventionModelBuilder();
            builder.EnumType<Life>();

            // Act
            builder.EnumType<Life>();
            IEdmModel model = builder.GetEdmModel();
        }
Exemple #33
0
        public void ODataConventionModelBuilder_DataContractAttribute_WorksOnEnumType()
        {
            // Arrange
            var builder = new ODataConventionModelBuilder();
            builder.EnumType<Life>();

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

            // Assert
            IEdmEnumType enumType = model.SchemaElements.OfType<IEdmEnumType>().Single();
            Assert.NotNull(enumType);
            Assert.Equal(2, enumType.Members.Count());
            Assert.Equal("Feelings", enumType.Name);
            Assert.Equal("Test", enumType.Namespace);
            Assert.True(enumType.Members.Any(m => m.Name.Equals("happy")));
            Assert.True(enumType.Members.Any(m => m.Name.Equals("sad")));
        }
Exemple #34
0
        public void ReadComplexValue_CanReadDynamicPropertiesForOpenComplexType()
        {
            // Arrange
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

            builder.ComplexType <SimpleOpenAddress>();
            builder.EnumType <SimpleEnum>();
            IEdmModel model = builder.GetEdmModel();
            IEdmComplexTypeReference addressTypeReference = model.GetEdmTypeReference(typeof(SimpleOpenAddress)).AsComplex();

            var deserializerProvider = new Mock <ODataDeserializerProvider>().Object;
            var deserializer         = new ODataComplexTypeDeserializer(deserializerProvider);

            ODataEnumValue enumValue = new ODataEnumValue("Third", typeof(SimpleEnum).FullName);

            ODataComplexValue complexValue = new ODataComplexValue
            {
                Properties = new[]
                {
                    // declared properties
                    new ODataProperty {
                        Name = "Street", Value = "My Way #599"
                    },
                    new ODataProperty {
                        Name = "City", Value = "Redmond & Shanghai"
                    },

                    // dynamic properties
                    new ODataProperty {
                        Name = "GuidProperty", Value = new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA")
                    },
                    new ODataProperty {
                        Name = "EnumValue", Value = enumValue
                    },
                    new ODataProperty {
                        Name = "DateTimeProperty", Value = new DateTimeOffset(new DateTime(1992, 1, 1))
                    }
                },
                TypeName = typeof(SimpleOpenAddress).FullName
            };

            ODataDeserializerContext readContext = new ODataDeserializerContext()
            {
                Model = model
            };

            // Act
            SimpleOpenAddress address = deserializer.ReadComplexValue(complexValue, addressTypeReference, readContext)
                                        as SimpleOpenAddress;

            // Assert
            Assert.NotNull(address);

            // Verify the declared properties
            Assert.Equal("My Way #599", address.Street);
            Assert.Equal("Redmond & Shanghai", address.City);

            // Verify the dynamic properties
            Assert.NotNull(address.Properties);
            Assert.Equal(3, address.Properties.Count());
            Assert.Equal(new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA"), address.Properties["GuidProperty"]);
            Assert.Equal(SimpleEnum.Third, address.Properties["EnumValue"]);
            Assert.Equal(new DateTimeOffset(new DateTime(1992, 1, 1)), address.Properties["DateTimeProperty"]);
        }
        public void ReadEntry_CanReadDynamicPropertiesForInheritanceOpenEntityType()
        {
            // Arrange
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntityType<SimpleOpenCustomer>();
            builder.EnumType<SimpleEnum>();
            IEdmModel model = builder.GetEdmModel();

            IEdmEntityTypeReference vipCustomerTypeReference = model.GetEdmTypeReference(typeof(SimpleVipCustomer)).AsEntity();

            var deserializerProvider = new DefaultODataDeserializerProvider();
            var deserializer = new ODataEntityDeserializer(deserializerProvider);

            ODataEntry odataEntry = new ODataEntry
            {
                Properties = new[]
                {
                    // declared properties
                    new ODataProperty { Name = "CustomerId", Value = 121 },
                    new ODataProperty { Name = "Name", Value = "VipName #121" },
                    new ODataProperty { Name = "VipNum", Value = "Vip Num 001" },

                    // dynamic properties
                    new ODataProperty { Name = "GuidProperty", Value = new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA") },
                },
                TypeName = typeof(SimpleVipCustomer).FullName
            };

            ODataDeserializerContext readContext = new ODataDeserializerContext()
            {
                Model = model
            };

            ODataEntryWithNavigationLinks entry = new ODataEntryWithNavigationLinks(odataEntry);

            // Act
            SimpleVipCustomer customer = deserializer.ReadEntry(entry, vipCustomerTypeReference, readContext)
                as SimpleVipCustomer;

            // Assert
            Assert.NotNull(customer);

            // Verify the declared properties
            Assert.Equal(121, customer.CustomerId);
            Assert.Equal("VipName #121", customer.Name);
            Assert.Equal("Vip Num 001", customer.VipNum);

            // Verify the dynamic properties
            Assert.NotNull(customer.CustomerProperties);
            Assert.Equal(1, customer.CustomerProperties.Count());
            Assert.Equal(new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA"), customer.CustomerProperties["GuidProperty"]);
        }
 public ODataEnumDeserializerTests()
 {
     var builder = new ODataConventionModelBuilder();
     builder.EnumType<Color>().Namespace = "NS";
     _edmModel = builder.GetEdmModel();
 }
        public static IEdmModel GetEdmModel()
        {
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntitySet<ConventionCustomer>("ConventionCustomers");
            builder.EntitySet<ConventionOrder>("ConventionOrders");

            EnumTypeConfiguration<ConventionGender> enumType = builder.EnumType<ConventionGender>();
            enumType.Member(ConventionGender.Female);
            enumType.Member(ConventionGender.Male);
            #region functions

            FunctionConfiguration getAllCustomers = builder.Function("GetAllConventionCustomers");
            getAllCustomers.ReturnsCollectionFromEntitySet<ConventionCustomer>("ConventionCustomers");
            getAllCustomers.IsComposable = true;

            // Return all the customers whose name contains CustomerName
            FunctionConfiguration getAllCustomersOverload = builder.Function("GetAllConventionCustomers");
            getAllCustomersOverload.ReturnsCollectionFromEntitySet<ConventionCustomer>("ConventionCustomers");
            getAllCustomersOverload.Parameter<string>("CustomerName");
            getAllCustomersOverload.IsComposable = true;

            FunctionConfiguration getCustomersById = builder.Function("GetConventionCustomerById");
            getCustomersById.Parameter<int>("CustomerId");
            getCustomersById.ReturnsFromEntitySet<ConventionCustomer>("ConventionCustomers");
            getCustomersById.IsComposable = true;

            FunctionConfiguration getOrder = builder.Function("GetConventionOrderByCustomerIdAndOrderName");
            getOrder.Parameter<int>("CustomerId");
            getOrder.Parameter<string>("OrderName");
            getOrder.ReturnsFromEntitySet<ConventionOrder>("ConventionOrders");

            FunctionConfiguration getCustomerNameById = builder.Function("GetConventionCustomerNameById");
            getCustomerNameById.Parameter<int>("CustomerId");
            getCustomerNameById.Returns<string>();

            FunctionConfiguration getDefinedGenders = builder.Function("GetDefinedGenders");
            getDefinedGenders.ReturnsCollection<ConventionGender>()
                .IsComposable = true;

            FunctionConfiguration function = builder.Function("AdvancedFunction").Returns<bool>();
            function.CollectionParameter<int>("nums");
            function.CollectionParameter<ConventionGender>("genders");
            function.Parameter<ConventionAddress>("location");
            function.CollectionParameter<ConventionAddress>("addresses");
            function.EntityParameter<ConventionCustomer>("customer");
            function.CollectionEntityParameter<ConventionCustomer>("customers");

            #endregion

            #region actions

            ActionConfiguration resetDataSource = builder.Action("ResetDataSource");

            // bug: error message:  non-binding parameter type must be either Primitive, Complex, Collection of Primitive or a Collection of Complex.
            /*
            ActionConfiguration createCustomer = builder.Action("CreateCustomer");
            createCustomer.Parameter<ConventionCustomer>("Customer");
            createCustomer.ReturnsFromEntitySet<ConventionCustomer>("ConventionCustomers");
           */

            ActionConfiguration udpateAddress = builder.Action("UpdateAddress");
            udpateAddress.Parameter<ConventionAddress>("Address");
            udpateAddress.Parameter<int>("ID");
            udpateAddress.ReturnsCollectionFromEntitySet<ConventionCustomer>("ConventionCustomers");

            ActionConfiguration action = builder.Action("AdvancedAction");
            action.CollectionParameter<int>("nums");
            action.CollectionParameter<ConventionGender>("genders");
            action.Parameter<ConventionAddress>("location");
            action.CollectionParameter<ConventionAddress>("addresses");
            action.EntityParameter<ConventionCustomer>("customer");
            action.CollectionEntityParameter<ConventionCustomer>("customers");

            #endregion

            var schemaNamespace = typeof(ConventionCustomer).Namespace;

            builder.Namespace = schemaNamespace;

            var edmModel = builder.GetEdmModel();
            var container = edmModel.EntityContainer as EdmEntityContainer;

            #region function imports

            var entitySet = container.FindEntitySet("ConventionCustomers");
            var getCustomersByIdOfEdmFunction = edmModel.FindDeclaredOperations(schemaNamespace + ".GetConventionCustomerById").First() as EdmFunction;
            container.AddFunctionImport("GetConventionCustomerByIdImport", getCustomersByIdOfEdmFunction, new EdmEntitySetReferenceExpression(entitySet));

            var functionsOfGetAllConventionCustomers = edmModel.FindDeclaredOperations(schemaNamespace + ".GetAllConventionCustomers");
            var getAllConventionCustomersOfEdmFunction = functionsOfGetAllConventionCustomers.FirstOrDefault(f => f.Parameters.Count() == 0) as EdmFunction;
            container.AddFunctionImport("GetAllConventionCustomersImport", getAllConventionCustomersOfEdmFunction, new EdmEntitySetReferenceExpression(entitySet));

            // TODO delete this overload after bug 1640 is fixed: It can not find the correct overload function if the the function is exposed as a function import.
            var getAllConventionCustomersOverloadOfEdmFunction = functionsOfGetAllConventionCustomers.FirstOrDefault(f => f.Parameters.Count() > 0) as EdmFunction;
            container.AddFunctionImport("GetAllConventionCustomersImport", getAllConventionCustomersOverloadOfEdmFunction, new EdmEntitySetReferenceExpression(entitySet));

            var entitySet1 = container.FindEntitySet("ConventionOrders");
            var GetConventionOrderByCustomerIdAndOrderNameOfEdmFunction = edmModel.FindDeclaredOperations(schemaNamespace + ".GetConventionOrderByCustomerIdAndOrderName").First() as EdmFunction;
            container.AddFunctionImport("GetConventionOrderByCustomerIdAndOrderNameImport", GetConventionOrderByCustomerIdAndOrderNameOfEdmFunction, new EdmEntitySetReferenceExpression(entitySet1));

            var getConventionCustomerNameByIdOfEdmFunction = edmModel.FindDeclaredOperations(schemaNamespace + ".GetConventionCustomerNameById").First() as EdmFunction;
            container.AddFunctionImport("GetConventionCustomerNameByIdImport", getConventionCustomerNameByIdOfEdmFunction, null);

            #endregion

            #region action imports

            var resetDataSourceOfEdmAction = edmModel.FindDeclaredOperations(schemaNamespace + ".ResetDataSource").FirstOrDefault() as EdmAction;
            container.AddActionImport("ResetDataSourceImport", resetDataSourceOfEdmAction);

            // TODO: it is a potential issue that entity can not be used as an un-bound parameter.
            /*
            var createCustomerOfEdmAction = edmModel.FindDeclaredOperations(schemaNamespace + ".CreateCustomer").FirstOrDefault() as EdmAction;
            container.AddActionImport("CreateCustomerImport", createCustomerOfEdmAction);
            */
            var updateAddressOfEdmAction = edmModel.FindDeclaredOperations(schemaNamespace + ".UpdateAddress").FirstOrDefault() as EdmAction;
            container.AddActionImport("UpdateAddressImport", updateAddressOfEdmAction, new EdmEntitySetReferenceExpression(entitySet));

            #endregion

            return edmModel;
        }
        public static IEdmModel GetEdmModel(ODataConventionModelBuilder builder)
        {
            builder.EntitySet <ConventionCustomer>("ConventionCustomers");
            builder.EntitySet <ConventionOrder>("ConventionOrders");

            EnumTypeConfiguration <ConventionGender> enumType = builder.EnumType <ConventionGender>();

            enumType.Member(ConventionGender.Female);
            enumType.Member(ConventionGender.Male);
            #region functions

            FunctionConfiguration getAllCustomers = builder.Function("GetAllConventionCustomers");
            getAllCustomers.ReturnsCollectionFromEntitySet <ConventionCustomer>("ConventionCustomers");
            getAllCustomers.IsComposable = true;

            // Return all the customers whose name contains CustomerName
            FunctionConfiguration getAllCustomersOverload = builder.Function("GetAllConventionCustomers");
            getAllCustomersOverload.ReturnsCollectionFromEntitySet <ConventionCustomer>("ConventionCustomers");
            getAllCustomersOverload.Parameter <string>("CustomerName");
            getAllCustomersOverload.IsComposable = true;

            FunctionConfiguration getCustomersById = builder.Function("GetConventionCustomerById");
            getCustomersById.Parameter <int>("CustomerId");
            getCustomersById.ReturnsFromEntitySet <ConventionCustomer>("ConventionCustomers");
            getCustomersById.IsComposable = true;

            FunctionConfiguration getOrder = builder.Function("GetConventionOrderByCustomerIdAndOrderName");
            getOrder.Parameter <int>("CustomerId");
            getOrder.Parameter <string>("OrderName");
            getOrder.ReturnsFromEntitySet <ConventionOrder>("ConventionOrders");

            FunctionConfiguration getCustomerNameById = builder.Function("GetConventionCustomerNameById");
            getCustomerNameById.Parameter <int>("CustomerId");
            getCustomerNameById.Returns <string>();

            FunctionConfiguration getDefinedGenders = builder.Function("GetDefinedGenders");
            getDefinedGenders.ReturnsCollection <ConventionGender>()
            .IsComposable = true;

            FunctionConfiguration function = builder.Function("AdvancedFunction").Returns <bool>();
            function.CollectionParameter <int>("nums");
            function.CollectionParameter <ConventionGender>("genders");
            function.Parameter <ConventionAddress>("location");
            function.CollectionParameter <ConventionAddress>("addresses");
            function.EntityParameter <ConventionCustomer>("customer");
            function.CollectionEntityParameter <ConventionCustomer>("customers");

            #endregion

            #region actions

            ActionConfiguration resetDataSource = builder.Action("ResetDataSource");

            // bug: error message:  non-binding parameter type must be either Primitive, Complex, Collection of Primitive or a Collection of Complex.

            /*
             * ActionConfiguration createCustomer = builder.Action("CreateCustomer");
             * createCustomer.Parameter<ConventionCustomer>("Customer");
             * createCustomer.ReturnsFromEntitySet<ConventionCustomer>("ConventionCustomers");
             */

            ActionConfiguration udpateAddress = builder.Action("UpdateAddress");
            udpateAddress.Parameter <ConventionAddress>("Address");
            udpateAddress.Parameter <int>("ID");
            udpateAddress.ReturnsCollectionFromEntitySet <ConventionCustomer>("ConventionCustomers");

            ActionConfiguration action = builder.Action("AdvancedAction");
            action.CollectionParameter <int>("nums");
            action.CollectionParameter <ConventionGender>("genders");
            action.Parameter <ConventionAddress>("location");
            action.CollectionParameter <ConventionAddress>("addresses");
            action.EntityParameter <ConventionCustomer>("customer");
            action.CollectionEntityParameter <ConventionCustomer>("customers");

            #endregion

            var schemaNamespace = typeof(ConventionCustomer).Namespace;

            builder.Namespace = schemaNamespace;

            var edmModel  = builder.GetEdmModel();
            var container = edmModel.EntityContainer as EdmEntityContainer;

            #region function imports

            var entitySet = container.FindEntitySet("ConventionCustomers");
            var getCustomersByIdOfEdmFunction = edmModel.FindDeclaredOperations(schemaNamespace + ".GetConventionCustomerById").First() as EdmFunction;
            container.AddFunctionImport("GetConventionCustomerByIdImport", getCustomersByIdOfEdmFunction, new EdmPathExpression(entitySet.Name));

            var functionsOfGetAllConventionCustomers   = edmModel.FindDeclaredOperations(schemaNamespace + ".GetAllConventionCustomers");
            var getAllConventionCustomersOfEdmFunction = functionsOfGetAllConventionCustomers.FirstOrDefault(f => f.Parameters.Count() == 0) as EdmFunction;
            container.AddFunctionImport("GetAllConventionCustomersImport", getAllConventionCustomersOfEdmFunction, new EdmPathExpression(entitySet.Name));

            // TODO delete this overload after bug 1640 is fixed: It can not find the correct overload function if the the function is exposed as a function import.
            var getAllConventionCustomersOverloadOfEdmFunction = functionsOfGetAllConventionCustomers.FirstOrDefault(f => f.Parameters.Count() > 0) as EdmFunction;
            container.AddFunctionImport("GetAllConventionCustomersImport", getAllConventionCustomersOverloadOfEdmFunction, new EdmPathExpression(entitySet.Name));

            var entitySet1 = container.FindEntitySet("ConventionOrders");
            var GetConventionOrderByCustomerIdAndOrderNameOfEdmFunction = edmModel.FindDeclaredOperations(schemaNamespace + ".GetConventionOrderByCustomerIdAndOrderName").First() as EdmFunction;
            container.AddFunctionImport("GetConventionOrderByCustomerIdAndOrderNameImport", GetConventionOrderByCustomerIdAndOrderNameOfEdmFunction, new EdmPathExpression(entitySet1.Name));

            var getConventionCustomerNameByIdOfEdmFunction = edmModel.FindDeclaredOperations(schemaNamespace + ".GetConventionCustomerNameById").First() as EdmFunction;
            container.AddFunctionImport("GetConventionCustomerNameByIdImport", getConventionCustomerNameByIdOfEdmFunction, null);

            #endregion

            #region action imports

            var resetDataSourceOfEdmAction = edmModel.FindDeclaredOperations(schemaNamespace + ".ResetDataSource").FirstOrDefault() as EdmAction;
            container.AddActionImport("ResetDataSourceImport", resetDataSourceOfEdmAction);

            // TODO: it is a potential issue that entity can not be used as an un-bound parameter.

            /*
             * var createCustomerOfEdmAction = edmModel.FindDeclaredOperations(schemaNamespace + ".CreateCustomer").FirstOrDefault() as EdmAction;
             * container.AddActionImport("CreateCustomerImport", createCustomerOfEdmAction);
             */
            var updateAddressOfEdmAction = edmModel.FindDeclaredOperations(schemaNamespace + ".UpdateAddress").FirstOrDefault() as EdmAction;
            container.AddActionImport("UpdateAddressImport", updateAddressOfEdmAction, new EdmPathExpression(entitySet.Name));

            #endregion

            return(edmModel);
        }
Exemple #39
0
        private static IEdmModel GetModel()
        {
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntitySet<Account>("Accounts");
            builder.EnumType<Gender>();

            builder.Namespace = typeof(Account).Namespace;

            var edmModel = builder.GetEdmModel();
            return edmModel;
        }
Exemple #40
0
        public void ODataConventionModelBuilder_DataContractAttribute_WithAddedExplicitlyMember()
        {
            // Arrange
            var builder = new ODataConventionModelBuilder();
            builder.EnumType<Life>();
            builder.EnumTypes.Single(e => e.Name == "Feelings").AddMember(Life.JustSoSo);

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

            // Assert
            IEdmEnumType enumType = model.SchemaElements.OfType<IEdmEnumType>().Single();
            Assert.NotNull(enumType);
            Assert.Equal(3, enumType.Members.Count());
            Assert.Equal("Feelings", enumType.Name);
            Assert.Equal("Test", enumType.Namespace);
            Assert.True(enumType.Members.Any(m => m.Name.Equals("happy")));
            Assert.True(enumType.Members.Any(m => m.Name.Equals("sad")));
            Assert.True(enumType.Members.Any(m => m.Name.Equals("JustSoSo")));
        }
Exemple #41
0
        private IEdmModel BuildEdmModel()
        {
            var builder = new ODataConventionModelBuilder();

            // General Entities
            builder.EntityType <House>();
            builder.EntitySet <House>("Houses");
            builder.EntityType <Room>();
            builder.EntitySet <Room>("Rooms");

            // Interior definition (user-defined properties)
            builder.EntityType <InteriorDefinition>()
            .HasMany(d => d.Properties).AutomaticallyExpand(true);
            builder.EntitySet <InteriorDefinition>("InteriorDefinitions");

            builder.EntityType <InteriorPropertyDefinition>();
            builder.EnumType <InteriorPropertyType>();

            // Register base type of interiors and ignore user-defined properties
            // they are defined below according to the current DB confiuration
            var interiorTypeConfiguration = builder.EntityType <Interior>();

            interiorTypeConfiguration.Ignore(i => i.DefinitionID);
            interiorTypeConfiguration.Ignore(i => i.Definition);
            interiorTypeConfiguration.Ignore(i => i.StringProperty1);
            interiorTypeConfiguration.Ignore(i => i.StringProperty2);
            interiorTypeConfiguration.Ignore(i => i.StringProperty3);
            interiorTypeConfiguration.Ignore(i => i.IntProperty1);
            interiorTypeConfiguration.Ignore(i => i.IntProperty2);
            interiorTypeConfiguration.Ignore(i => i.IntProperty3);
            interiorTypeConfiguration.Ignore(i => i.DoubleProperty1);
            interiorTypeConfiguration.Ignore(i => i.DoubleProperty2);
            interiorTypeConfiguration.Ignore(i => i.DoubleProperty3);
            builder.EntitySet <Interior>("Interior");

            // Build the intermediate model and register all dynamic interior definitions
            var model          = (EdmModel)builder.GetEdmModel();
            var entityType     = (IEdmEntityType)model.FindDeclaredType(interiorTypeConfiguration.FullName);
            var container      = (EdmEntityContainer)model.EntityContainer;
            var ns             = model.SchemaElements.First().Namespace;
            var propertyLookup = BuildPropertyLookup(typeof(IUserDefinedPropertyBag));

            var definitions = _houseContext.InteriorDefinitions.Include(d => d.Properties).ToArray();

            foreach (var definition in definitions)
            {
                // register type by name using the Interior as base type.
                var type = new EdmEntityType(ns, definition.Name, entityType, false, false);
                // define the correct CLR type as backstore
                model.SetAnnotationValue(type, new ClrTypeAnnotation(typeof(Interior)));
                // remember which interior definition represents this EDM type.
                model.SetAnnotationValue(type, new InteriorDefinitionAnnotation(definition.ID));
                // register user defined properties
                foreach (var property in definition.Properties)
                {
                    var edmProperty = type.AddStructuralProperty(property.Name, MapToEdmType(property.PropertyType));
                    model.SetAnnotationValue(edmProperty, new ClrPropertyInfoAnnotation(propertyLookup[property.PropertyName].Single()));
                }

                // add to model and register entity set
                model.AddElement(type);
                container.AddEntitySet(_pluralizer.Pluralize(definition.Name), type);
            }

            // Register type mapping handler which translates Interiors correctly.
            model.SetAnnotationValue <IEdmModelClrTypeMappingHandler>(model, new InteriorDefinitionAwareClrTypeMappingHandler());

            // validate the model again newly added entities
            if (!model.Validate(out var errors))
            {
                Debug.Fail("EDM is not valid", string.Join(Environment.NewLine, errors.Select(e => e.ToString())));
            }

            return(model);
        }
Exemple #42
0
        public void ReadComplexValue_CanReadDynamicCollectionPropertiesForOpenComplexType()
        {
            // Arrange
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

            builder.ComplexType <SimpleOpenAddress>();
            builder.EnumType <SimpleEnum>();
            IEdmModel model = builder.GetEdmModel();
            IEdmComplexTypeReference addressTypeReference =
                model.GetEdmTypeReference(typeof(SimpleOpenAddress)).AsComplex();

            var deserializerProvider = new DefaultODataDeserializerProvider();
            var deserializer         = new ODataComplexTypeDeserializer(deserializerProvider);

            ODataEnumValue enumValue = new ODataEnumValue("Third", typeof(SimpleEnum).FullName);

            ODataCollectionValue collectionValue = new ODataCollectionValue
            {
                TypeName = "Collection(" + typeof(SimpleEnum).FullName + ")",
                Items    = new[] { enumValue, enumValue }
            };

            ODataComplexValue complexValue = new ODataComplexValue
            {
                Properties = new[]
                {
                    // declared properties
                    new ODataProperty {
                        Name = "Street", Value = "My Way #599"
                    },

                    // dynamic properties
                    new ODataProperty {
                        Name = "CollectionProperty", Value = collectionValue
                    }
                },
                TypeName = typeof(SimpleOpenAddress).FullName
            };

            ODataDeserializerContext readContext = new ODataDeserializerContext()
            {
                Model = model
            };

            // Act
            SimpleOpenAddress address = deserializer.ReadComplexValue(complexValue, addressTypeReference, readContext)
                                        as SimpleOpenAddress;

            // Assert
            Assert.NotNull(address);

            // Verify the declared properties
            Assert.Equal("My Way #599", address.Street);
            Assert.Null(address.City);

            // Verify the dynamic properties
            Assert.NotNull(address.Properties);
            Assert.Equal(1, address.Properties.Count());

            var collectionValues = Assert.IsType <List <SimpleEnum> >(address.Properties["CollectionProperty"]);

            Assert.NotNull(collectionValues);
            Assert.Equal(2, collectionValues.Count());
            Assert.Equal(SimpleEnum.Third, collectionValues[0]);
            Assert.Equal(SimpleEnum.Third, collectionValues[1]);
        }
Exemple #43
0
        public static IEdmModel GetEdmModel(WebRouteConfiguration configuration)
        {
            ODataConventionModelBuilder        builder = configuration.CreateConventionModelBuilder();
            EntitySetConfiguration <Employee>  entitySetConfiguration            = builder.EntitySet <Employee>("Employees");
            EntityTypeConfiguration <Manager>  entityTypeConfigurationOfManager  = builder.EntityType <Manager>();
            EntityTypeConfiguration <Employee> entityTypeConfigurationOfEmployee = builder.EntityType <Employee>();

            #region functions

            // Function bound to a collection of base EntityType.
            entityTypeConfigurationOfEmployee.Collection.Function("GetCount")
            .Returns <int>();

            // Overload
            entityTypeConfigurationOfEmployee.Collection.Function("GetCount")
            .Returns <int>()
            .Parameter <string>("Name");

            // Overload with one optional parameter
            var salaryRangeCount = entityTypeConfigurationOfEmployee.Collection.Function("GetWholeSalary")
                                   .Returns <int>();
            salaryRangeCount.Parameter <double>("minSalary");
            salaryRangeCount.Parameter <double>("maxSalary").Optional();
            salaryRangeCount.Parameter <double>("aveSalary").HasDefaultValue("8.9");

            // Function bound to a collection of derived EntityType.
            entityTypeConfigurationOfManager.Collection.Function("GetCount")
            .Returns <int>();

            // Function bound to an base EntityType
            entityTypeConfigurationOfEmployee.Function("GetEmailsCount")
            .Returns <int>();

            entityTypeConfigurationOfEmployee.Function("GetOptionalAddresses")
            .ReturnsCollection <Address>()
            .IsComposable = true;

            entityTypeConfigurationOfEmployee.Function("GetEmails")
            .ReturnsCollection <string>()
            .IsComposable = false;

            // Function bound to a derived EntityType
            entityTypeConfigurationOfManager.Function("GetEmailsCount")
            .Returns <int>();

            // Function with primitive and collection of primitive parameters
            var function = entityTypeConfigurationOfEmployee.Collection.Function("PrimitiveFunction").Returns <string>();
            function.Parameter <int>("param");
            function.Parameter <double?>("price");          // nullable
            function.Parameter <string>("name");            // nullable
            function.CollectionParameter <string>("names"); // collection with nullable element

            // Function with Enum and collection of Enum parameters
            function = entityTypeConfigurationOfEmployee.Collection.Function("EnumFunction").Returns <string>();
            function.Parameter <Color>("bkColor");
            function.Parameter <Color?>("frColor");         // nullable
            function.CollectionParameter <Color>("colors"); // collection with non-nullable element

            // Function with complex and collection of complex parameters
            function = entityTypeConfigurationOfEmployee.Collection.Function("ComplexFunction").ReturnsCollection <Address>();
            function.Parameter <Address>("address").Nullable = false;
            function.Parameter <Address>("location");            // nullable
            function.CollectionParameter <Address>("addresses"); // collection with nullable element

            // Function with entity and collection of entity parameters
            function = entityTypeConfigurationOfEmployee.Collection.Function("EntityFunction").Returns <string>();
            function.EntityParameter <Employee>("person").Nullable = false;
            function.EntityParameter <Employee>("guard");           // nullable
            function.CollectionEntityParameter <Employee>("staff"); // collection with nullable element

            #endregion

            #region actions

            // Action bound to a collection of base EntityType
            entityTypeConfigurationOfEmployee.Collection.Action("IncreaseSalary")
            .ReturnsCollectionFromEntitySet(entitySetConfiguration)
            .Parameter <string>("Name");

            // Action bound to a collection of derived EntityType
            entityTypeConfigurationOfManager.Collection.Action("IncreaseSalary")
            .ReturnsCollectionFromEntitySet(entitySetConfiguration)
            .Parameter <string>("Name");

            // Action bound to a base EntityType
            entityTypeConfigurationOfEmployee.Action("IncreaseSalary")
            .Returns <int>();

            // Action bound to a derived EntityType
            entityTypeConfigurationOfManager.Action("IncreaseSalary")
            .Returns <int>();

            // Action with optional parameters
            var action = entityTypeConfigurationOfManager.Action("IncreaseWholeSalary")
                         .Returns <int>();
            action.Parameter <double>("minSalary");
            action.Parameter <double>("maxSalary").Optional();
            action.Parameter <double>("aveSalary").HasDefaultValue("8.9");

            // Action with primitive and collection of primitive parameters
            action = entityTypeConfigurationOfEmployee.Collection.Action("PrimitiveAction");
            action.Parameter <int>("param");
            action.Parameter <double?>("price");          // nullable
            action.Parameter <string>("name");            // nullable
            action.CollectionParameter <string>("names"); // collection with nullable element

            // Action with Enum and collection of Enum parameters
            action = entityTypeConfigurationOfEmployee.Collection.Action("EnumAction");
            action.Parameter <Color>("bkColor");
            action.Parameter <Color?>("frColor");         // nullable
            action.CollectionParameter <Color>("colors"); // collection with non-nullable element

            // Action with complex and collection of complex parameters
            action = entityTypeConfigurationOfEmployee.Collection.Action("ComplexAction");
            action.Parameter <Address>("address").Nullable = false;
            action.Parameter <Address>("location");            // nullable
            action.CollectionParameter <Address>("addresses"); // collection with nullable element

            // Action with entity and collection of entity parameters
            action = entityTypeConfigurationOfEmployee.Collection.Action("EntityAction");
            action.EntityParameter <Employee>("person").Nullable = false;
            action.EntityParameter <Employee>("guard");           // nullable
            action.CollectionEntityParameter <Employee>("staff"); // collection with nullable element
            #endregion

            builder.Action("ResetDataSource");

            builder.EnumType <Color>().Namespace         = "NS";
            builder.ComplexType <Address>().Namespace    = "NS";
            builder.ComplexType <SubAddress>().Namespace = "NS";
            builder.EntityType <Employee>().Namespace    = "NS";
            builder.EntityType <Manager>().Namespace     = "NS";

            return(builder.GetEdmModel());
        }
        public void ReadEntry_CanReadDynamicPropertiesForOpenEntityType()
        {
            // Arrange
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

            builder.EntityType <SimpleOpenCustomer>();
            builder.EnumType <SimpleEnum>();
            IEdmModel model = builder.GetEdmModel();

            IEdmEntityTypeReference customerTypeReference = model.GetEdmTypeReference(typeof(SimpleOpenCustomer)).AsEntity();

            var deserializerProvider = new DefaultODataDeserializerProvider();
            var deserializer         = new ODataEntityDeserializer(deserializerProvider);

            ODataEnumValue enumValue = new ODataEnumValue("Third", typeof(SimpleEnum).FullName);

            ODataComplexValue[] complexValues =
            {
                new ODataComplexValue
                {
                    TypeName   = typeof(SimpleOpenAddress).FullName,
                    Properties = new[]
                    {
                        // declared properties
                        new ODataProperty {
                            Name = "Street", Value = "Street 1"
                        },
                        new ODataProperty {
                            Name = "City", Value = "City 1"
                        },

                        // dynamic properties
                        new ODataProperty
                        {
                            Name  = "DateTimeProperty",
                            Value = new DateTimeOffset(new DateTime(2014, 5, 6))
                        }
                    }
                },
                new ODataComplexValue
                {
                    TypeName   = typeof(SimpleOpenAddress).FullName,
                    Properties = new[]
                    {
                        // declared properties
                        new ODataProperty {
                            Name = "Street", Value = "Street 2"
                        },
                        new ODataProperty {
                            Name = "City", Value = "City 2"
                        },

                        // dynamic properties
                        new ODataProperty
                        {
                            Name  = "ArrayProperty",
                            Value = new ODataCollectionValue{
                                TypeName = "Collection(Edm.Int32)", Items = new[]{                                         1, 2, 3, 4 }
                            }
                        }
                    }
                }
            };

            ODataCollectionValue collectionValue = new ODataCollectionValue
            {
                TypeName = "Collection(" + typeof(SimpleOpenAddress).FullName + ")",
                Items    = complexValues
            };

            ODataEntry odataEntry = new ODataEntry
            {
                Properties = new[]
                {
                    // declared properties
                    new ODataProperty {
                        Name = "CustomerId", Value = 991
                    },
                    new ODataProperty {
                        Name = "Name", Value = "Name #991"
                    },

                    // dynamic properties
                    new ODataProperty {
                        Name = "GuidProperty", Value = new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA")
                    },
                    new ODataProperty {
                        Name = "EnumValue", Value = enumValue
                    },
                    new ODataProperty {
                        Name = "CollectionProperty", Value = collectionValue
                    }
                },
                TypeName = typeof(SimpleOpenCustomer).FullName
            };

            ODataDeserializerContext readContext = new ODataDeserializerContext()
            {
                Model = model
            };

            ODataEntryWithNavigationLinks entry = new ODataEntryWithNavigationLinks(odataEntry);

            // Act
            SimpleOpenCustomer customer = deserializer.ReadEntry(entry, customerTypeReference, readContext)
                                          as SimpleOpenCustomer;

            // Assert
            Assert.NotNull(customer);

            // Verify the declared properties
            Assert.Equal(991, customer.CustomerId);
            Assert.Equal("Name #991", customer.Name);

            // Verify the dynamic properties
            Assert.NotNull(customer.CustomerProperties);
            Assert.Equal(3, customer.CustomerProperties.Count());
            Assert.Equal(new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA"), customer.CustomerProperties["GuidProperty"]);
            Assert.Equal(SimpleEnum.Third, customer.CustomerProperties["EnumValue"]);

            // Verify the dynamic collection property
            var collectionValues = Assert.IsType <List <SimpleOpenAddress> >(customer.CustomerProperties["CollectionProperty"]);

            Assert.NotNull(collectionValues);
            Assert.Equal(2, collectionValues.Count());

            Assert.Equal(new DateTimeOffset(new DateTime(2014, 5, 6)), collectionValues[0].Properties["DateTimeProperty"]);
            Assert.Equal(new List <int> {
                1, 2, 3, 4
            }, collectionValues[1].Properties["ArrayProperty"]);
        }
        public static IEdmModel GetEdmModel()
        {
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            EntitySetConfiguration<Employee> entitySetConfiguration = builder.EntitySet<Employee>("Employees");
            EntityTypeConfiguration<Manager> entityTypeConfigurationOfManager = builder.EntityType<Manager>();
            EntityTypeConfiguration<Employee> entityTypeConfigurationOfEmployee = builder.EntityType<Employee>();

            #region functions

            // Function bound to a collection of base EntityType.
            entityTypeConfigurationOfEmployee.Collection.Function("GetCount")
                .Returns<int>();

            // Overload
            entityTypeConfigurationOfEmployee.Collection.Function("GetCount")
                .Returns<int>()
                .Parameter<string>("Name");

            // Function bound to a collection of derived EntityType.
            entityTypeConfigurationOfManager.Collection.Function("GetCount")
                .Returns<int>();

            // Function bound to an base EntityType
            entityTypeConfigurationOfEmployee.Function("GetEmailsCount")
                .Returns<int>();

            entityTypeConfigurationOfEmployee.Function("GetOptionalAddresses")
                .ReturnsCollection<Address>()
                .IsComposable = true;

            entityTypeConfigurationOfEmployee.Function("GetEmails")
                .ReturnsCollection<string>()
                .IsComposable = false;

            // Function bound to a derived EntityType
            entityTypeConfigurationOfManager.Function("GetEmailsCount")
                .Returns<int>();

            // Function with primitive and collection of primitive parameters
            var function = entityTypeConfigurationOfEmployee.Collection.Function("PrimitiveFunction").Returns<string>();
            function.Parameter<int>("param");
            function.Parameter<double?>("price"); // nullable
            function.Parameter<string>("name"); // nullable
            function.CollectionParameter<string>("names"); // collection with nullable element

            // Function with Enum and collection of Enum parameters
            function = entityTypeConfigurationOfEmployee.Collection.Function("EnumFunction").Returns<string>();
            function.Parameter<Color>("bkColor");
            function.Parameter<Color?>("frColor"); // nullable
            function.CollectionParameter<Color>("colors"); // collection with non-nullable element

            // Function with complex and collection of complex parameters
            function = entityTypeConfigurationOfEmployee.Collection.Function("ComplexFunction").ReturnsCollection<Address>();
            function.Parameter<Address>("address").OptionalParameter = false;
            function.Parameter<Address>("location"); // nullable
            function.CollectionParameter<Address>("addresses"); // collection with nullable element

            // Function with entity and collection of entity parameters
            function = entityTypeConfigurationOfEmployee.Collection.Function("EntityFunction").Returns<string>();
            function.EntityParameter<Employee>("person").OptionalParameter = false;
            function.EntityParameter<Employee>("guard"); // nullable
            function.CollectionEntityParameter<Employee>("staff"); // collection with nullable element

            #endregion

            #region actions

            // Action bound to a collection of base EntityType
            entityTypeConfigurationOfEmployee.Collection.Action("IncreaseSalary")
                .ReturnsCollectionFromEntitySet(entitySetConfiguration)
                .Parameter<string>("Name");

            // Action bound to a collection of derived EntityType
            entityTypeConfigurationOfManager.Collection.Action("IncreaseSalary")
                .ReturnsCollectionFromEntitySet(entitySetConfiguration)
                .Parameter<string>("Name");

            // Action bound to a base EntityType
            entityTypeConfigurationOfEmployee.Action("IncreaseSalary")
                .Returns<int>();

            // Action bound to a derived EntityType
            entityTypeConfigurationOfManager.Action("IncreaseSalary")
                .Returns<int>();

            // Action with primitive and collection of primitive parameters
            var action = entityTypeConfigurationOfEmployee.Collection.Action("PrimitiveAction");
            action.Parameter<int>("param");
            action.Parameter<double?>("price"); // nullable
            action.Parameter<string>("name"); // nullable
            action.CollectionParameter<string>("names"); // collection with nullable element

            // Action with Enum and collection of Enum parameters
            action = entityTypeConfigurationOfEmployee.Collection.Action("EnumAction");
            action.Parameter<Color>("bkColor");
            action.Parameter<Color?>("frColor"); // nullable
            action.CollectionParameter<Color>("colors"); // collection with non-nullable element

            // Action with complex and collection of complex parameters
            action = entityTypeConfigurationOfEmployee.Collection.Action("ComplexAction");
            action.Parameter<Address>("address").OptionalParameter = false;
            action.Parameter<Address>("location"); // nullable
            action.CollectionParameter<Address>("addresses"); // collection with nullable element

            // Action with entity and collection of entity parameters
            action = entityTypeConfigurationOfEmployee.Collection.Action("EntityAction");
            action.EntityParameter<Employee>("person").OptionalParameter = false;
            action.EntityParameter<Employee>("guard"); // nullable
            action.CollectionEntityParameter<Employee>("staff"); // collection with nullable element
            #endregion

            builder.Action("ResetDataSource");

            builder.EnumType<Color>().Namespace = "NS";
            builder.ComplexType<Address>().Namespace = "NS";
            builder.ComplexType<SubAddress>().Namespace = "NS";
            builder.EntityType<Employee>().Namespace = "NS";
            builder.EntityType<Manager>().Namespace = "NS";

            return builder.GetEdmModel();
        }