private void ApplyProcedureConventions(ProcedureConfiguration procedure)
 {
     foreach (IProcedureConvention convention in _conventions.OfType <IProcedureConvention>())
     {
         convention.Apply(procedure, this);
     }
 }
示例#2
0
 /// <summary>
 /// Remove the procedure from the model
 /// </summary>
 /// <param name="procedure">The procedure to be removed</param>
 /// <returns><see>true</see> if the procedure is present in the model and <see>false</see> otherwise.</returns>
 public virtual bool RemoveProcedure(ProcedureConfiguration procedure)
 {
     if (procedure == null)
     {
         throw Error.ArgumentNull("procedure");
     }
     return(_procedures.Remove(procedure));
 }
        public void CanRemoveProcedure()
        {
            // Arrange
            // Act
            ODataModelBuilder      builder   = new ODataModelBuilder();
            ActionConfiguration    action    = new ActionConfiguration(builder, "Format");
            ProcedureConfiguration procedure = builder.Procedures.SingleOrDefault();
            bool removed = builder.RemoveProcedure(procedure);

            // Assert
            Assert.True(removed);
            Assert.Equal(0, builder.Procedures.Count());
        }
示例#4
0
        public void CanCreateTransientAction()
        {
            ODataModelBuilder builder = new ODataModelBuilder();
            EntityTypeConfiguration <Customer> customer = builder.Entity <Customer>();

            customer.TransientAction("Reward");

            ProcedureConfiguration action = builder.Procedures.SingleOrDefault();

            Assert.NotNull(action);
            Assert.True(action.IsBindable);
            Assert.False(action.IsAlwaysBindable);
        }
示例#5
0
        public void AttemptToRemoveNonExistantEntityReturnsFalse()
        {
            // Arrange
            ODataModelBuilder      builder  = new ODataModelBuilder();
            ODataModelBuilder      builder2 = new ODataModelBuilder();
            ProcedureConfiguration toRemove = builder2.Action("ToRemove");

            // Act
            bool removedByName = builder.RemoveProcedure("ToRemove");
            bool removed       = builder.RemoveProcedure(toRemove);

            //Assert
            Assert.False(removedByName);
            Assert.False(removed);
        }
示例#6
0
 /// <summary>
 /// Adds a procedure to the model.
 /// </summary>
 public virtual void AddProcedure(ProcedureConfiguration procedure)
 {
     _procedures.Add(procedure);
 }
        private static IEdmExpression GetEdmEntitySetExpression(Dictionary<string, EdmEntitySet> entitySets, ProcedureConfiguration procedure)
        {
            if (procedure.EntitySet != null)
            {
                if (entitySets.ContainsKey(procedure.EntitySet.Name))
                {
                    EdmEntitySet entitySet = entitySets[procedure.EntitySet.Name];
                    return new EdmEntitySetReferenceExpression(entitySet);
                }
                else
                {
                    throw Error.InvalidOperation(SRResources.EntitySetNotFoundForName, procedure.EntitySet.Name);
                }
            }
            else if (procedure.EntitySetPath != null)
            {
                return new EdmPathExpression(procedure.EntitySetPath);
            }

            return null;
        }
        private static void AddProcedure(
            this IEdmModel model,
            ProcedureConfiguration procedure,
            EdmEntityContainer container,
            Dictionary<Type, IEdmStructuredType> edmTypeMap,
            Dictionary<string, EdmEntitySet> edmEntitySetMap,
            bool isAction)
        {
            IEdmTypeReference returnReference = GetEdmTypeReference(edmTypeMap, procedure.ReturnType, nullable: true);
            IEdmExpression expression = GetEdmEntitySetExpression(edmEntitySetMap, procedure);
            IEdmPathExpression pathExpression = procedure.EntitySetPath != null
                ? new EdmPathExpression(procedure.EntitySetPath)
                : null;

            EdmOperation operation;
            EdmOperationImport operationImport;
            if (isAction)
            {
                EdmAction action = new EdmAction(
                    container.Namespace, procedure.Name, returnReference, procedure.IsBindable, pathExpression);
                operation = action;
                operationImport = new EdmActionImport(container, procedure.Name, action, expression);
            }
            else
            {
                EdmFunction function = new EdmFunction(
                    container.Namespace,
                    procedure.Name,
                    returnReference,
                    procedure.IsBindable,
                    pathExpression,
                    procedure.IsComposable);
                operation = function;
                operationImport = new EdmFunctionImport(
                    container, procedure.Name, function, expression, includeInServiceDocument: true);
            }

            AddProcedureParameters(operation, procedure, edmTypeMap);
            if (procedure.IsBindable)
            {
                model.SetIsAlwaysBindable(operation, procedure.IsAlwaysBindable);
                AddProcedureLinkBuilder(model, operation, procedure);
                ValidateProcedureEntitySetPath(model, operationImport, procedure);
            }

            EdmModel edmModel = model as EdmModel;
            if (edmModel != null)
            {
                edmModel.AddElement(operation);
            }
            container.AddElement(operationImport);
        }
 private static void ValidateProcedureEntitySetPath(IEdmModel model, IEdmOperationImport operationImport, ProcedureConfiguration procedure)
 {
     IEdmOperationParameter procedureParameter;
     IEnumerable<IEdmNavigationProperty> navPath;
     IEnumerable<EdmError> edmErrors;
     if (procedure.EntitySetPath != null && !operationImport.TryGetRelativeEntitySetPath(model, out procedureParameter, out navPath, out edmErrors))
     {
         throw Error.InvalidOperation(SRResources.ProcedureHasInvalidEntitySetPath, String.Join("/", procedure.EntitySetPath.ToArray()), procedure.FullName);
     }
 }
 private static void AddProcedureLinkBuilder(IEdmModel model, IEdmOperation operation, ProcedureConfiguration procedure)
 {
     if (procedure.BindingParameter.TypeConfiguration.Kind == EdmTypeKind.Entity)
     {
         ActionConfiguration actionConfiguration = procedure as ActionConfiguration;
         IEdmAction action = operation as IEdmAction;
         FunctionConfiguration functionConfiguration = procedure as FunctionConfiguration;
         IEdmFunction function = operation as IEdmFunction;
         if (actionConfiguration != null && actionConfiguration.GetActionLink() != null && action != null)
         {
             model.SetActionLinkBuilder(
                 action,
                 new ActionLinkBuilder(actionConfiguration.GetActionLink(), actionConfiguration.FollowsConventions));
         }
         else if (functionConfiguration != null && functionConfiguration.GetFunctionLink() != null && function != null)
         {
             model.SetFunctionLinkBuilder(
                 function,
                 new FunctionLinkBuilder(functionConfiguration.GetFunctionLink(), functionConfiguration.FollowsConventions));
         }
     }
 }
 private static void AddProcedureParameters(EdmOperation operation, ProcedureConfiguration procedure, Dictionary<Type, IEdmStructuredType> edmTypeMap)
 {
     foreach (ParameterConfiguration parameter in procedure.Parameters)
     {
         // TODO: http://aspnetwebstack.codeplex.com/workitem/417
         bool isParameterOptional = EdmLibHelpers.IsNullable(parameter.TypeConfiguration.ClrType);
         IEdmTypeReference parameterTypeReference = GetEdmTypeReference(edmTypeMap, parameter.TypeConfiguration, nullable: isParameterOptional);
         IEdmOperationParameter operationParameter = new EdmOperationParameter(operation, parameter.Name, parameterTypeReference);
         operation.AddParameter(operationParameter);
     }
 }