public static IEdmModel InterfaceCriticalPropertyValueMustNotBeNullUsingEntitySetNullNavigationModel()
        {
            var model = new EdmModel();

            var entity   = new EdmEntityType("NS", "Entity");
            var entityId = entity.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32);

            entity.AddKeys(entityId);
            model.AddElement(entity);

            var entityContainer = new EdmEntityContainer("NS", "Container");

            model.AddElement(entityContainer);

            var goodSet = new EdmEntitySet(entityContainer, "GoodSet", entity);

            entityContainer.AddElement(goodSet);

            var badSet = new CustomEntitySet(entityContainer, "BadSet", entity);

            badSet.AddNavigationTarget(null, goodSet);
            entityContainer.AddElement(badSet);

            return(model);
        }
        static InstanceAnnotationWriterIntegrationTests()
        {
            Model      = new EdmModel();
            EntityType = new EdmEntityType("TestNamespace", "TestEntityType");
            Model.AddElement(EntityType);

            var keyProperty = new EdmStructuralProperty(EntityType, "ID", EdmCoreModel.Instance.GetInt32(false));

            EntityType.AddKeys(new IEdmStructuralProperty[] { keyProperty });
            EntityType.AddProperty(keyProperty);
            var resourceNavigationProperty = EntityType.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo {
                Name = "ResourceNavigationProperty", Target = EntityType, TargetMultiplicity = EdmMultiplicity.ZeroOrOne
            });
            var resourceSetNavigationProperty = EntityType.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo {
                Name = "ResourceSetNavigationProperty", Target = EntityType, TargetMultiplicity = EdmMultiplicity.Many
            });

            ComplexType = new EdmComplexType("TestNamespace", "Address");
            Model.AddElement(ComplexType);

            var defaultContainer = new EdmEntityContainer("TestNamespace", "DefaultContainer");

            Model.AddElement(defaultContainer);
            EntitySet = new EdmEntitySet(defaultContainer, "TestEntitySet", EntityType);
            EntitySet.AddNavigationTarget(resourceNavigationProperty, EntitySet);
            EntitySet.AddNavigationTarget(resourceSetNavigationProperty, EntitySet);
            defaultContainer.AddElement(EntitySet);
            Singleton = new EdmSingleton(defaultContainer, "TestSingleton", EntityType);
            Singleton.AddNavigationTarget(resourceNavigationProperty, EntitySet);
            Singleton.AddNavigationTarget(resourceSetNavigationProperty, EntitySet);
            defaultContainer.AddElement(Singleton);
        }
        public void CreateOperationIdWithSHA5ForOverloadEdmFunctionImport(bool enableOperationId)
        {
            // Arrange
            EdmModel      model    = new EdmModel();
            EdmEntityType customer = new EdmEntityType("NS", "Customer");

            customer.AddKeys(customer.AddStructuralProperty("ID", EdmPrimitiveTypeKind.Int32));
            model.AddElement(customer);
            EdmFunction function1 = new EdmFunction("NS", "MyFunction1", EdmCoreModel.Instance.GetString(false), false, null, false);

            function1.AddParameter("entity", new EdmEntityTypeReference(customer, false));
            function1.AddParameter("param", EdmCoreModel.Instance.GetString(false));
            model.AddElement(function1);

            EdmFunction function2 = new EdmFunction("NS", "MyFunction1", EdmCoreModel.Instance.GetString(false), false, null, false);

            function2.AddParameter("entity", new EdmEntityTypeReference(customer, false));
            function2.AddParameter("param", EdmCoreModel.Instance.GetString(false));
            function2.AddParameter("otherParam", EdmCoreModel.Instance.GetString(false));
            model.AddElement(function2);
            EdmEntityContainer container       = new EdmEntityContainer("NS", "Default");
            EdmFunctionImport  functionImport1 = new EdmFunctionImport(container, "MyFunction", function1);
            EdmFunctionImport  functionImport2 = new EdmFunctionImport(container, "MyFunction", function2);

            container.AddElement(functionImport1);
            container.AddElement(functionImport2);
            model.AddElement(container);

            OpenApiConvertSettings settings = new OpenApiConvertSettings
            {
                EnableOperationId = enableOperationId,
                AddSingleQuotesForStringParameters = true,
            };
            ODataContext context = new ODataContext(model, settings);

            ODataPath path = new ODataPath(new ODataOperationImportSegment(functionImport1));

            // Act
            var operation = _operationHandler.CreateOperation(context, path);

            // Assert
            Assert.NotNull(operation);

            if (enableOperationId)
            {
                Assert.Equal("FunctionImport.MyFunction-cc1c", operation.OperationId);
            }
            else
            {
                Assert.Null(operation.OperationId);
            }
        }
示例#4
0
        private static IEdmModel GetGraphModel()
        {
            /*
             * contact and directoyObject have the same common base type as "entity" as below.
             *                entity
             *             /          \
             *     directoryObject outlookItem
             *         /                \
             *     group              contact
             */
            var model = new EdmModel();

            var entity = new EdmEntityType("microsoft.graph", "entity", null, true, false);

            entity.AddKeys(entity.AddStructuralProperty("id", EdmCoreModel.Instance.GetString(false)));
            model.AddElement(entity);

            var directoryObject = new EdmEntityType("microsoft.graph", "directoryObject", entity, false, true);

            model.AddElement(directoryObject);

            var outlookItem = new EdmEntityType("microsoft.graph", "outlookItem", entity, true, false);

            model.AddElement(outlookItem);

            var group      = new EdmEntityType("microsoft.graph", "group", directoryObject, false, true);
            var navigation = group.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo
            {
                Name = "members",
                TargetMultiplicity = EdmMultiplicity.Many,
                Target             = directoryObject
            });

            model.AddElement(group);

            var contact = new EdmEntityType("microsoft.graph", "contact", outlookItem, false, true);

            contact.AddStructuralProperty("displayName", EdmPrimitiveTypeKind.String);
            model.AddElement(contact);

            var entityContainer  = new EdmEntityContainer("microsoft.graph", "default");
            var directoryObjects = new EdmEntitySet(entityContainer, "directoryObjects", directoryObject);
            var groups           = new EdmEntitySet(entityContainer, "groups", group);

            entityContainer.AddElement(directoryObjects);
            entityContainer.AddElement(groups);
            model.AddElement(entityContainer);
            groups.AddNavigationTarget(navigation, directoryObjects);

            return(model);
        }
示例#5
0
        private static EdmModel BuildEdmModel()
        {
            EdmModel model = new EdmModel();

            EdmEntityContainer defaultContainer = new EdmEntityContainer(DefaultNamespace, "DefaultContainer");

            model.AddElement(defaultContainer);

            //Define entity type
            var companyType = new EdmEntityType(DefaultNamespace, "Company");
            var companyId   = new EdmStructuralProperty(companyType, "CompanyID", EdmCoreModel.Instance.GetInt32(false));

            companyType.AddProperty(companyId);
            companyType.AddKeys(companyId);
            companyType.AddProperty(new EdmStructuralProperty(companyType, "Name", EdmCoreModel.Instance.GetString(true)));
            companyType.AddProperty(new EdmStructuralProperty(companyType, "Revenue",
                                                              EdmCoreModel.Instance.GetInt32(true)));
            model.AddElement(companyType);

            //Define singleton
            EdmSingleton company = new EdmSingleton(defaultContainer, "Company", companyType);

            defaultContainer.AddElement(company);

            return(model);
        }
        public void Initialize()
        {
            EdmModel      edmModel      = new EdmModel();
            EdmEntityType edmEntityType = new EdmEntityType("TestNamespace", "EntityType", baseType: null, isAbstract: false, isOpen: true);

            edmModel.AddElement(edmEntityType);
            EdmComplexType ComplexType = new EdmComplexType("TestNamespace", "TestComplexType");

            ComplexType.AddProperty(new EdmStructuralProperty(ComplexType, "StringProperty", EdmCoreModel.Instance.GetString(false)));
            edmModel.AddElement(ComplexType);
            EdmComplexType derivedComplexType = new EdmComplexType("TestNamespace", "TestDerivedComplexType", ComplexType, true);

            derivedComplexType.AddProperty(new EdmStructuralProperty(derivedComplexType, "DerivedStringProperty", EdmCoreModel.Instance.GetString(false)));
            edmModel.AddElement(derivedComplexType);

            var defaultContainer = new EdmEntityContainer("TestNamespace", "DefaultContainer_sub");

            edmModel.AddElement(defaultContainer);
            this.entitySet = new EdmEntitySet(defaultContainer, "TestEntitySet", edmEntityType);
            defaultContainer.AddElement(this.entitySet);

            this.model       = TestUtils.WrapReferencedModelsToMainModel("TestNamespace", "DefaultContainer", edmModel);
            this.entityType  = edmEntityType;
            this.complexType = ComplexType;
        }
        private static void AddProcedures(this EdmEntityContainer container, IEnumerable <ProcedureConfiguration> configurations, Dictionary <string, IEdmStructuredType> edmTypeMap, Dictionary <string, EdmEntitySet> edmEntitySetMap)
        {
            foreach (ProcedureConfiguration procedure in configurations)
            {
                switch (procedure.Kind)
                {
                case ProcedureKind.Action:
                    ActionConfiguration action          = procedure as ActionConfiguration;
                    IEdmTypeReference   returnReference = GetEdmTypeReference(edmTypeMap, action.ReturnType, nullable: true);
                    IEdmExpression      expression      = GetEdmEntitySetExpression(edmEntitySetMap, action);

                    EdmFunctionImport functionImport = new EdmFunctionImport(container, action.Name, returnReference, expression, action.IsSideEffecting, action.IsComposable, action.IsBindable);
                    foreach (ParameterConfiguration parameter in action.Parameters)
                    {
                        // TODO: http://aspnetwebstack.codeplex.com/workitem/417
                        IEdmTypeReference    parameterTypeReference = GetEdmTypeReference(edmTypeMap, parameter.TypeConfiguration, nullable: true);
                        EdmFunctionParameter functionParameter      = new EdmFunctionParameter(functionImport, parameter.Name, parameterTypeReference, EdmFunctionParameterMode.In);
                        functionImport.AddParameter(functionParameter);
                    }
                    container.AddElement(functionImport);
                    break;

                case ProcedureKind.Function:
                    Contract.Assert(false, "Functions are not supported.");
                    break;

                case ProcedureKind.ServiceOperation:
                    Contract.Assert(false, "ServiceOperations are not supported.");
                    break;
                }
            }
        }
示例#8
0
        public void VerifyAnnotationComputedConcurrency()
        {
            var model    = new EdmModel();
            var entity   = new EdmEntityType("NS1", "Product");
            var entityId = entity.AddStructuralProperty("Id", EdmCoreModel.Instance.GetInt32(false));

            entity.AddKeys(entityId);
            EdmStructuralProperty name1   = entity.AddStructuralProperty("Name", EdmCoreModel.Instance.GetString(false));
            EdmStructuralProperty timeVer = entity.AddStructuralProperty("UpdatedTime", EdmCoreModel.Instance.GetDate(false));

            model.AddElement(entity);

            SetComputedAnnotation(model, entityId);  // semantic meaning is V3's 'Identity' for Key profperty
            SetComputedAnnotation(model, timeVer);   // semantic meaning is V3's 'Computed' for non-key profperty

            var entityContainer = new EdmEntityContainer("NS1", "Container");

            model.AddElement(entityContainer);
            EdmEntitySet set1 = new EdmEntitySet(entityContainer, "Products", entity);

            model.SetOptimisticConcurrencyAnnotation(set1, new IEdmStructuralProperty[] { entityId, timeVer });
            entityContainer.AddElement(set1);

            string csdlStr = GetEdmx(model, EdmxTarget.OData);

            Assert.Equal(@"<?xml version=""1.0"" encoding=""utf-16""?><edmx:Edmx Version=""4.0"" xmlns:edmx=""http://docs.oasis-open.org/odata/ns/edmx""><edmx:DataServices><Schema Namespace=""NS1"" xmlns=""http://docs.oasis-open.org/odata/ns/edm""><EntityType Name=""Product""><Key><PropertyRef Name=""Id"" /></Key><Property Name=""Id"" Type=""Edm.Int32"" Nullable=""false""><Annotation Term=""Org.OData.Core.V1.Computed"" Bool=""true"" /></Property><Property Name=""Name"" Type=""Edm.String"" Nullable=""false"" /><Property Name=""UpdatedTime"" Type=""Edm.Date"" Nullable=""false""><Annotation Term=""Org.OData.Core.V1.Computed"" Bool=""true"" /></Property></EntityType><EntityContainer Name=""Container""><EntitySet Name=""Products"" EntityType=""NS1.Product""><Annotation Term=""Org.OData.Core.V1.OptimisticConcurrency""><Collection><PropertyPath>Id</PropertyPath><PropertyPath>UpdatedTime</PropertyPath></Collection></Annotation></EntitySet></EntityContainer></Schema></edmx:DataServices></edmx:Edmx>", csdlStr);
        }
        public static IEdmModel InterfaceCriticalPropertyValueMustNotBeNullUsingEntitySetNullNavigationSetModel()
        {
            var model = new EdmModel();

            var entity   = new EdmEntityType("NS", "Entity");
            var entityId = entity.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32);

            entity.AddKeys(entityId);
            var nav = entity.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo()
            {
                Name = "Nav", Target = entity, TargetMultiplicity = EdmMultiplicity.One
            });

            model.AddElement(entity);

            var entityContainer = new EdmEntityContainer("NS", "Container");

            model.AddElement(entityContainer);

            var badSet = new CustomEntitySet(entityContainer, "BadSet", entity);

            badSet.AddNavigationTarget(nav, null);
            entityContainer.AddElement(badSet);

            return(model);
        }
示例#10
0
        public ODataSingletonDeserializerTest()
        {
            EdmModel model        = new EdmModel();
            var      employeeType = new EdmEntityType("NS", "Employee");

            employeeType.AddStructuralProperty("EmployeeId", EdmPrimitiveTypeKind.Int32);
            employeeType.AddStructuralProperty("EmployeeName", EdmPrimitiveTypeKind.String);
            model.AddElement(employeeType);

            EdmEntityContainer defaultContainer = new EdmEntityContainer("NS", "Default");

            model.AddElement(defaultContainer);

            _singleton = new EdmSingleton(defaultContainer, "CEO", employeeType);
            defaultContainer.AddElement(_singleton);

            model.SetAnnotationValue <ClrTypeAnnotation>(employeeType, new ClrTypeAnnotation(typeof(EmployeeModel)));

            _edmModel = model;

            _readContext = new ODataDeserializerContext
            {
                Path         = new ODataPath(new SingletonSegment(_singleton)),
                Model        = _edmModel,
                ResourceType = typeof(EmployeeModel)
            };

            _deserializerProvider = ODataDeserializerProviderFactory.Create();
        }
        public OpenApiRequestBodyGeneratorTest()
        {
            EdmModel           model     = new EdmModel();
            EdmEntityContainer container = new EdmEntityContainer("NS", "Default");

            model.AddElement(container);

            EdmEntityType customer = new EdmEntityType("NS", "Customer", null, false, false, true);

            customer.AddKeys(customer.AddStructuralProperty("ID", EdmPrimitiveTypeKind.Int32));

            var boolType = EdmCoreModel.Instance.GetBoolean(false);

            var actionEntitySetPath = new EdmPathExpression("Param1/Nav");
            var edmAction           = new EdmAction("NS", "Checkout", boolType, true, actionEntitySetPath);

            edmAction.AddParameter(new EdmOperationParameter(edmAction, "bindingParameter", new EdmEntityTypeReference(customer, true)));
            edmAction.AddParameter("param", EdmCoreModel.Instance.GetString(true));
            model.AddElement(edmAction);

            var actionImportEntitySetPath = new EdmPathExpression("Param1/Nav2");
            var edmActionImport           = new EdmActionImport(container, "CheckoutImport", edmAction, actionImportEntitySetPath);

            container.AddElement(edmActionImport);

            _model        = model;
            _entityType   = customer;
            _action       = edmAction;
            _actionImport = edmActionImport;
        }
示例#12
0
        public void CanWriteEdmEntitySetWithEdmEntityTypeButValidationFailed()
        {
            string expected =
                "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
                "<edmx:Edmx Version=\"4.0\" xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\">" +
                "<edmx:DataServices>" +
                "<Schema Namespace=\"NS\" xmlns=\"http://docs.oasis-open.org/odata/ns/edm\">" +
                "<EntityContainer Name=\"Default\">" +
                "<EntitySet Name=\"Customers\" EntityType=\"Edm.EntityType\" />" +
                "</EntityContainer>" +
                "</Schema>" +
                "</edmx:DataServices>" +
                "</edmx:Edmx>";

            EdmModel           model     = new EdmModel();
            EdmEntityContainer container = new EdmEntityContainer("NS", "Default");
            EdmEntitySet       entitySet = new EdmEntitySet(container, "Customers", EdmCoreModel.Instance.GetEntityType());

            container.AddElement(entitySet);
            model.AddElement(container);
            IEnumerable <EdmError> errors;

            Assert.False(model.Validate(out errors));
            Assert.Equal(2, errors.Count());

            string csdlStr = GetCsdl(model, CsdlTarget.OData);

            Assert.Equal(expected, csdlStr);
        }
示例#13
0
        public static EdmModel ComplexNamespaceOverlappingModel()
        {
            EdmModel model = new EdmModel();

            EdmEntityContainer container             = new EdmEntityContainer("Default", "Container");
            EdmAction          simpleOperationAction = new EdmAction("Default", "SimpleFunction", EdmCoreModel.Instance.GetInt32(false));

            model.AddElement(simpleOperationAction);
            EdmActionImport simpleOperation = new EdmActionImport(container, "SimpleFunction", simpleOperationAction);

            container.AddElement(simpleOperation);
            model.AddElement(container);

            XElement annotationElement =
                new XElement("{http://foo}Annotation",
                             new XElement("{http://foo}Child",
                                          new XElement("{http://foo1}GrandChild",
                                                       new XElement("{http://foo}GreatGrandChild",
                                                                    "1"
                                                                    )
                                                       )
                                          ),
                             new XElement("{http://foo1}Child",
                                          new XElement("{http://foo}GrandChild",
                                                       "1"
                                                       )
                                          )
                             );
            var annotation = new EdmStringConstant(EdmCoreModel.Instance.GetString(false), annotationElement.ToString());

            annotation.SetIsSerializedAsElement(model, true);
            model.SetAnnotationValue(simpleOperation, "http://foo", "Annotation", annotation);

            return(model);
        }
        private EdmModel CreateModel()
        {
            var model = new EdmModel();

            var customer   = new EdmEntityType("NS1", "Customer");
            var customerId = new EdmStructuralProperty(customer, "CustomerID", EdmCoreModel.Instance.GetString(false));

            customer.AddProperty(customerId);
            customer.AddKeys(customerId);
            model.AddElement(customer);

            var title = new EdmTerm("NS1", "Title", EdmCoreModel.Instance.GetString(true));

            model.AddElement(title);

            var person = new EdmEntityType("NS1", "Person");
            var Id     = person.AddStructuralProperty("ID", EdmCoreModel.Instance.GetString(false));

            person.AddKeys(Id);
            model.AddElement(person);

            var container = new EdmEntityContainer("NS1", "Container");

            container.AddElement(new EdmEntitySet(container, "Customers", customer));
            model.AddElement(container);

            IEnumerable <EdmError> errors;

            Assert.IsTrue(model.Validate(out errors), "validate");

            return(model);
        }
示例#15
0
        static ODataResourceTypeContextTests()
        {
            Model = new EdmModel();
            EntitySetElementType = new EdmEntityType("ns", "Customer");
            ExpectedEntityType   = new EdmEntityType("ns", "VipCustomer", EntitySetElementType);
            ActualEntityType     = new EdmEntityType("ns", "DerivedVipCustomer", ExpectedEntityType);
            ComplexType          = new EdmComplexType("ns", "Address");

            EdmEntityContainer defaultContainer = new EdmEntityContainer("ns", "DefaultContainer");

            Model.AddElement(defaultContainer);

            EntitySet = new EdmEntitySet(defaultContainer, "Customers", EntitySetElementType);
            Model.AddElement(EntitySetElementType);
            Model.AddElement(ExpectedEntityType);
            Model.AddElement(ActualEntityType);
            defaultContainer.AddElement(EntitySet);



            SerializationInfo = new ODataResourceSerializationInfo {
                NavigationSourceName = "MyCustomers", NavigationSourceEntityTypeName = "ns.MyCustomer", ExpectedTypeName = "ns.MyVipCustomer"
            };
            SerializationInfoWithEdmUnknowEntitySet = new ODataResourceSerializationInfo()
            {
                NavigationSourceName = null, NavigationSourceEntityTypeName = "ns.MyCustomer", ExpectedTypeName = "ns.MyVipCustomer", NavigationSourceKind = EdmNavigationSourceKind.UnknownEntitySet
            };
            TypeContextWithoutModel           = ODataResourceTypeContext.Create(SerializationInfo, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null, throwIfMissingTypeInfo: true);
            TypeContextWithModel              = ODataResourceTypeContext.Create(/*serializationInfo*/ null, EntitySet, EntitySetElementType, ExpectedEntityType, throwIfMissingTypeInfo: true);
            TypeContextWithEdmUnknowEntitySet = ODataResourceTypeContext.Create(SerializationInfoWithEdmUnknowEntitySet, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null, throwIfMissingTypeInfo: true);
            BaseTypeContextThatThrows         = ODataResourceTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null, throwIfMissingTypeInfo: true);
            BaseTypeContextThatWillNotThrow   = ODataResourceTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null, throwIfMissingTypeInfo: false);
        }
示例#16
0
        static ODataFeedAndEntryTypeContextTests()
        {
            Model = new EdmModel();
            EntitySetElementType = new EdmEntityType("ns", "Customer");
            ExpectedEntityType   = new EdmEntityType("ns", "VipCustomer", EntitySetElementType);
            ActualEntityType     = new EdmEntityType("ns", "DerivedVipCustomer", ExpectedEntityType);

            EdmEntityContainer defaultContainer = new EdmEntityContainer("ns", "DefaultContainer");

            Model.AddElement(defaultContainer);
            Model.AddVocabularyAnnotation(new EdmAnnotation(defaultContainer, UrlConventionsConstants.ConventionTerm, UrlConventionsConstants.KeyAsSegmentAnnotationValue));

            EntitySet = new EdmEntitySet(defaultContainer, "Customers", EntitySetElementType);
            Model.AddElement(EntitySetElementType);
            Model.AddElement(ExpectedEntityType);
            Model.AddElement(ActualEntityType);
            defaultContainer.AddElement(EntitySet);

            SerializationInfo = new ODataFeedAndEntrySerializationInfo {
                NavigationSourceName = "MyCustomers", NavigationSourceEntityTypeName = "ns.MyCustomer", ExpectedTypeName = "ns.MyVipCustomer"
            };
            TypeContextWithoutModel         = ODataFeedAndEntryTypeContext.Create(SerializationInfo, navigationSource: null, navigationSourceEntityType: null, expectedEntityType: null, model: Model, throwIfMissingTypeInfo: true);
            TypeContextWithModel            = ODataFeedAndEntryTypeContext.Create(/*serializationInfo*/ null, EntitySet, EntitySetElementType, ExpectedEntityType, Model, throwIfMissingTypeInfo: true);
            BaseTypeContextThatThrows       = ODataFeedAndEntryTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedEntityType: null, model: Model, throwIfMissingTypeInfo: true);
            BaseTypeContextThatWillNotThrow = ODataFeedAndEntryTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedEntityType: null, model: Model, throwIfMissingTypeInfo: false);
        }
示例#17
0
        public void BuildSelectExpandNode_Works_IfOnlyNavigationPropertyDefinedOnType()
        {
            // Assert
            EdmModel      model  = new EdmModel();
            EdmEntityType entity = new EdmEntityType("NS", "Entity");

            entity.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo
            {
                Name               = "Nav",
                Target             = entity,
                TargetMultiplicity = EdmMultiplicity.One
            });
            model.AddElement(entity);
            EdmEntityContainer container = new EdmEntityContainer("NS", "Container");
            EdmSingleton       singleton = container.AddSingleton("Single", entity);

            container.AddElement(singleton);
            model.AddElement(container);

            // Act
            SelectExpandClause selectExpandClause = new ODataQueryOptionParser(model, entity, singleton,
                                                                               new Dictionary <string, string>
            {
                { "$select", "Nav" }
            }).ParseSelectAndExpand();

            SelectExpandNode selectExpandNode = new SelectExpandNode(selectExpandClause, entity, model);

            // Assert
            Assert.Null(selectExpandNode.SelectedStructuralProperties);
            Assert.Null(selectExpandNode.SelectedComplexTypeProperties);

            Assert.NotNull(selectExpandNode.SelectedNavigationProperties);
            Assert.Single(selectExpandNode.SelectedNavigationProperties);
        }
示例#18
0
        static ODataEntityReferenceLinksTests()
        {
            EdmModel       tmpModel    = new EdmModel();
            EdmComplexType complexType = new EdmComplexType("TestNamespace", "TestComplexType");

            complexType.AddProperty(new EdmStructuralProperty(complexType, "StringProperty", EdmCoreModel.Instance.GetString(false)));
            tmpModel.AddElement(complexType);

            EntityType = new EdmEntityType("TestNamespace", "TestEntityType");
            tmpModel.AddElement(EntityType);
            var keyProperty = new EdmStructuralProperty(EntityType, "ID", EdmCoreModel.Instance.GetInt32(false));

            EntityType.AddKeys(new IEdmStructuralProperty[] { keyProperty });
            EntityType.AddProperty(keyProperty);

            var defaultContainer = new EdmEntityContainer("TestNamespace", "DefaultContainer_sub");

            tmpModel.AddElement(defaultContainer);
            EntitySet = new EdmEntitySet(defaultContainer, "Customers", EntityType);
            defaultContainer.AddElement(EntitySet);

            EdmModel = TestUtils.WrapReferencedModelsToMainModel("TestNamespace", "DefaultContainer", tmpModel);
            MessageReaderSettingsReadAndValidateCustomInstanceAnnotations = new ODataMessageReaderSettings {
                ShouldIncludeAnnotation = ODataUtils.CreateAnnotationFilter("*")
            };
        }
示例#19
0
            private static IEdmModel CreateODataServiceModel(string ns)
            {
                EdmModel model            = new EdmModel();
                var      defaultContainer = new EdmEntityContainer(ns, "DefaultContainer");

                model.AddElement(defaultContainer);

                var personType       = new EdmEntityType(ns, "Person");
                var personIdProperty = new EdmStructuralProperty(personType, "PersonId", EdmCoreModel.Instance.GetInt64(false));

                personType.AddProperty(personIdProperty);
                personType.AddKeys(new IEdmStructuralProperty[] { personIdProperty });
                personType.AddProperty(new EdmStructuralProperty(personType, "FirstName", EdmCoreModel.Instance.GetString(false)));
                personType.AddProperty(new EdmStructuralProperty(personType, "LastName", EdmCoreModel.Instance.GetString(false)));
                personType.AddProperty(new EdmStructuralProperty(personType, "UserName", EdmCoreModel.Instance.GetString(true)));
                personType.AddProperty(new EdmStructuralProperty(personType, "DbLocation", EdmCoreModel.Instance.GetSpatial(EdmPrimitiveTypeKind.GeographyPolygon, true)));
                personType.AddProperty(new EdmStructuralProperty(personType, "DbLineString", EdmCoreModel.Instance.GetSpatial(EdmPrimitiveTypeKind.GeographyMultiPoint, true)));

                model.AddElement(personType);
                var personSet = new EdmEntitySet(defaultContainer, "People", personType);

                defaultContainer.AddElement(personSet);

                model.SetAnnotationValue(personType, new ClrTypeAnnotation(typeof(Person)));

                return(model);
            }
示例#20
0
        private static void AddProcedures(this EdmModel model, IEnumerable <ProcedureConfiguration> configurations, EdmEntityContainer container,
                                          Dictionary <Type, IEdmType> edmTypeMap, IDictionary <string, EdmNavigationSource> edmNavigationSourceMap)
        {
            Contract.Assert(model != null, "Model can't be null");

            ValidateActionOverload(configurations.OfType <ActionConfiguration>());

            foreach (ProcedureConfiguration procedure in configurations)
            {
                IEdmTypeReference returnReference = GetEdmTypeReference(
                    edmTypeMap,
                    procedure.ReturnType,
                    procedure.ReturnType != null && EdmLibHelpers.IsNullable(procedure.ReturnType.ClrType));
                IEdmExpression     expression     = GetEdmEntitySetExpression(edmNavigationSourceMap, procedure);
                IEdmPathExpression pathExpression = procedure.EntitySetPath != null
                    ? new EdmPathExpression(procedure.EntitySetPath)
                    : null;

                EdmOperationImport operationImport;

                switch (procedure.Kind)
                {
                case ProcedureKind.Action:
                    operationImport = CreateActionImport(procedure, container, returnReference, expression, pathExpression);
                    break;

                case ProcedureKind.Function:
                    operationImport = CreateFunctionImport((FunctionConfiguration)procedure, container, returnReference, expression, pathExpression);
                    break;

                case ProcedureKind.ServiceOperation:
                    Contract.Assert(false, "ServiceOperations are not supported.");
                    goto default;

                default:
                    Contract.Assert(false, "Unsupported ProcedureKind");
                    return;
                }

                EdmOperation operation = (EdmOperation)operationImport.Operation;
                if (procedure.IsBindable && procedure.Title != null & procedure.Title != procedure.Name)
                {
                    model.SetOperationTitleAnnotation(operation, new OperationTitleAnnotation(procedure.Title));
                }

                AddProcedureParameters(operation, procedure, edmTypeMap);
                if (procedure.IsBindable)
                {
                    AddProcedureLinkBuilder(model, operation, procedure);
                    ValidateProcedureEntitySetPath(model, operationImport, procedure);
                }
                else
                {
                    container.AddElement(operationImport);
                }
                model.AddElement(operation);
            }
        }
示例#21
0
        private static EdmModel CreateCustomerProductsModel()
        {
            var model = new EdmModel();

            var container = new EdmEntityContainer("defaultNamespace", "DefaultContainer");

            model.AddElement(container);

            var productType = new EdmEntityType("defaultNamespace", "Product");

            model.AddElement(productType);

            var customerType = new EdmEntityType("defaultNamespace", "Customer");

            customerType.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo()
            {
                Name = "Products", Target = productType, TargetMultiplicity = EdmMultiplicity.Many
            });
            productType.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo()
            {
                Name = "Customers", Target = customerType, TargetMultiplicity = EdmMultiplicity.Many
            });

            model.AddElement(customerType);

            var productSet = new EdmEntitySet(
                container,
                "Products",
                productType);

            container.AddElement(productSet);

            var customerSet = new EdmEntitySet(
                container,
                "Customers",
                customerType);

            var productsNavProp = customerType.NavigationProperties().Single(np => np.Name == "Products");

            customerSet.AddNavigationTarget(productsNavProp, productSet);
            container.AddElement(customerSet);

            return(model);
        }
示例#22
0
        private static IEdmModel GetDerivedModel()
        {
            var model = new EdmModel();

            var entityType = new EdmEntityType("NS", "EntityType");
            var id         = entityType.AddStructuralProperty("ID", EdmCoreModel.Instance.GetString(false));

            entityType.AddKeys(id);

            var derivedEntityType = new EdmEntityType("NS", "DerivedEntityType", entityType);

            var navEntityType = new EdmEntityType("NS", "NavEntityType");
            var navEntityId   = navEntityType.AddStructuralProperty("ID", EdmCoreModel.Instance.GetString(false));

            navEntityType.AddKeys(navEntityId);

            var nav = derivedEntityType.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo()
            {
                Name               = "Nav",
                Target             = navEntityType,
                TargetMultiplicity = EdmMultiplicity.Many,
            });

            model.AddElement(entityType);
            model.AddElement(derivedEntityType);
            model.AddElement(navEntityType);

            var entityContainer = new EdmEntityContainer("NS", "Container");

            model.AddElement(entityContainer);
            var entitySet    = new EdmEntitySet(entityContainer, "EntitySet", entityType);
            var navEntitySet = new EdmEntitySet(entityContainer, "NavEntitySet", navEntityType);

            entitySet.AddNavigationTarget(nav, navEntitySet);

            entityContainer.AddElement(entitySet);
            entityContainer.AddElement(navEntitySet);

            return(model);
        }
        public static IEdmModel InterfaceCriticalPropertyValueMustNotBeNullUsingEntitySetElementTypeModel()
        {
            var model = new EdmModel();

            var entityContainer = new EdmEntityContainer("NS", "Container");

            model.AddElement(entityContainer);

            var badSet = new CustomEntitySet(entityContainer, "Set", null);

            entityContainer.AddElement(badSet);

            return(model);
        }
示例#24
0
        static InstanceAnnotationsReaderIntegrationTests()
        {
            EdmModel modelTmp = new EdmModel();

            EntityType = new EdmEntityType("TestNamespace", "TestEntityType");
            modelTmp.AddElement(EntityType);

            var keyProperty = new EdmStructuralProperty(EntityType, "ID", EdmCoreModel.Instance.GetInt32(false));

            EntityType.AddKeys(new IEdmStructuralProperty[] { keyProperty });
            EntityType.AddProperty(keyProperty);
            var resourceNavigationProperty = EntityType.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo {
                Name = "ResourceNavigationProperty", Target = EntityType, TargetMultiplicity = EdmMultiplicity.ZeroOrOne
            });
            var resourceSetNavigationProperty = EntityType.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo {
                Name = "ResourceSetNavigationProperty", Target = EntityType, TargetMultiplicity = EdmMultiplicity.Many
            });

            var defaultContainer = new EdmEntityContainer("TestNamespace", "DefaultContainer_sub");

            modelTmp.AddElement(defaultContainer);
            EntitySet = new EdmEntitySet(defaultContainer, "TestEntitySet", EntityType);
            EntitySet.AddNavigationTarget(resourceNavigationProperty, EntitySet);
            EntitySet.AddNavigationTarget(resourceSetNavigationProperty, EntitySet);
            defaultContainer.AddElement(EntitySet);

            Singleton = new EdmSingleton(defaultContainer, "TestSingleton", EntityType);
            Singleton.AddNavigationTarget(resourceNavigationProperty, EntitySet);
            Singleton.AddNavigationTarget(resourceSetNavigationProperty, EntitySet);
            defaultContainer.AddElement(Singleton);

            ComplexType = new EdmComplexType("TestNamespace", "TestComplexType");
            ComplexType.AddProperty(new EdmStructuralProperty(ComplexType, "StringProperty", EdmCoreModel.Instance.GetString(false)));
            modelTmp.AddElement(ComplexType);

            Model = TestUtils.WrapReferencedModelsToMainModel("TestNamespace", "DefaultContainer", modelTmp);
        }
示例#25
0
        public void HandCraftEdmType()
        {
            foreach (var mimeType in this.testMimeTypes)
            {
                EdmModel edmModel = new EdmModel();

                EdmEntityType edmEntityType = new EdmEntityType(NameSpace, "Person");
                edmModel.AddElement(edmEntityType);
                var keyProperty = new EdmStructuralProperty(edmEntityType, "PersonId", EdmCoreModel.Instance.GetInt32(false));
                edmEntityType.AddKeys(new IEdmStructuralProperty[] { keyProperty });
                edmEntityType.AddProperty(keyProperty);
                var property = new EdmStructuralProperty(edmEntityType, "Name", EdmCoreModel.Instance.GetString(true));
                edmEntityType.AddKeys(new IEdmStructuralProperty[] { property });
                edmEntityType.AddProperty(property);

                var defaultContainer = new EdmEntityContainer(NameSpace, "DefaultContainer");
                edmModel.AddElement(defaultContainer);

                EdmEntitySet entitySet = new EdmEntitySet(defaultContainer, "Person", edmEntityType);
                defaultContainer.AddElement(entitySet);

                var settings = new ODataMessageWriterSettings();
                settings.ODataUri = new ODataUri()
                {
                    ServiceRoot = this.ServiceUri
                };
                var responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream());
                responseMessageWithoutModel.SetHeader("Content-Type", mimeType);
                using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings))
                {
                    var odataWriter = messageWriter.CreateODataEntryWriter(entitySet, edmEntityType);

                    var    entry         = this.CreatePersonEntryWithoutSerializationInfo();
                    string expectedError = null;
                    if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                    {
                        expectedError = "ODataFeedAndEntryTypeContext_MetadataOrSerializationInfoMissing";
                    }

                    AssertThrows <ODataException>(
                        () =>
                    {
                        odataWriter.WriteStart(entry);
                        odataWriter.WriteEnd();
                    },
                        expectedError);
                }
            }
        }
示例#26
0
        static AsyncRoundtripJsonLightTests()
        {
            userModel = new EdmModel();

            testType = new EdmEntityType("NS", "Test");
            testType.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32);
            testType.AddStructuralProperty("Dummy", EdmPrimitiveTypeKind.String);
            userModel.AddElement(testType);

            defaultContainer = new EdmEntityContainer("NS", "DefaultContainer");
            userModel.AddElement(defaultContainer);

            singleton = new EdmSingleton(defaultContainer, "MySingleton", testType);
            defaultContainer.AddElement(singleton);
        }
示例#27
0
        public void AmbiguousEntitySetTest()
        {
            EdmEntityContainer container = new EdmEntityContainer("NS1", "Baz");

            IEdmEntitySet set1 = new StubEdmEntitySet("Foo", container);
            IEdmEntitySet set2 = new StubEdmEntitySet("Foo", container);
            IEdmEntitySet set3 = new StubEdmEntitySet("Foo", container);

            container.AddElement(set1);
            Assert.AreNotEqual(set3, container.FindEntitySet("Foo"), "Checking the object equality.");
            Assert.AreEqual(set3.Name, container.FindEntitySet("Foo").Name, "Checking the object equality.");

            container.AddElement(set2);
            container.AddElement(set3);

            IEdmEntitySet ambiguous = container.FindEntitySet("Foo");

            Assert.IsTrue(ambiguous.IsBad(), "Ambiguous binding is bad");

            Assert.AreEqual(EdmContainerElementKind.EntitySet, ambiguous.ContainerElementKind, "Correct container element kind");
            Assert.AreEqual("NS1.Baz", ambiguous.Container.FullName(), "Correct container name");
            Assert.AreEqual("Foo", ambiguous.Name, "Correct Name");
            Assert.IsTrue(ambiguous.EntityType().IsBad(), "Association is bad.");
        }
        private void InitializeEdmModel()
        {
            this.userModel = new EdmModel();

            testType = new EdmEntityType("NS", "Test");
            testType.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32);
            this.userModel.AddElement(testType);

            var defaultContainer = new EdmEntityContainer("NS", "DefaultContainer");

            this.userModel.AddElement(defaultContainer);

            this.singleton = new EdmSingleton(defaultContainer, "MySingleton", this.testType);
            defaultContainer.AddElement(this.singleton);
        }
        static ODataAsynchronousReaderTests()
        {
            userModel = new EdmModel();

            testType = new EdmEntityType("NS", "Test");
            testType.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32);
            userModel.AddElement(testType);

            var defaultContainer = new EdmEntityContainer("NS", "DefaultContainer");

            userModel.AddElement(defaultContainer);

            singleton = new EdmSingleton(defaultContainer, "MySingleton", testType);
            defaultContainer.AddElement(singleton);
        }
        private void MediaEntrySetSetting()
        {
            EdmModel tmpModel = new EdmModel();

            this.webType = new EdmEntityType("NS", "Web", null, /*isAbstract*/ false, /*isOpen*/ false, /*hasStream*/ true);
            tmpModel.AddElement(this.webType);

            this.defaultContainer = new EdmEntityContainer("NS", "DefaultContainer_sub");
            tmpModel.AddElement(defaultContainer);

            this.singleton = new EdmSingleton(defaultContainer, "MySingleton", this.webType);
            defaultContainer.AddElement(this.singleton);

            this.userModel       = TestUtils.WrapReferencedModelsToMainModel("NS", "DefaultContainer", tmpModel);
            this.referencedModel = tmpModel;
        }