public IHttpActionResult PutTaskNode(int id, TaskNode taskNode)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != taskNode.TaskNodeId)
            {
                return BadRequest();
            }

            db.Entry(taskNode).State = EntityState.Modified;

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!TaskNodeExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return StatusCode(HttpStatusCode.NoContent);
        }
        public IHttpActionResult PostTaskNode(TaskNode taskNode)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            db.TaskNodes.Add(taskNode);
            db.SaveChanges();

            return CreatedAtRoute("DefaultApi", new { id = taskNode.TaskNodeId }, taskNode);
        }
        public void InitialiseWorkflow()
        {
            //TODO: Error Checking

            int StartNodeId;
            int NodeId;
            int AccessType;
            int RelationType;
            int RelativeGroupId;                //This will need to be an array in later iterations, to allow for multiple branches
            String StartNodeText = "Start";

            ApprovalProcessType TypeDefinition;
            BranchNode NodeDef;
            GroupRoleRelation GroupRels;
            TaskAssignment TA;
            TaskNode TN;
            ReviewTask reviewTask;          //Can't be called Task as that causes interesting things to happen since .net defines a Task type already

            //Get Start Node for this Workflow Process Type
            TypeDefinition = db.ApprovalProcessTypes.FirstOrDefault(a => a.ApprovalProcessId.Equals(ApprovalProcessId));
            StartNodeId = (int)TypeDefinition.StartNodeId;
            //Get Relationship to use to send this Node off for approval
            NodeDef = db.BranchNodes.FirstOrDefault(a => a.NodeId.Equals(StartNodeId)  && a.Type.Equals(StartNodeText));
            //Note forcing one row returned from NodeDef
            NodeId = NodeDef.NodeId;
            AccessType = (int)NodeDef.AccessType;
            RelationType = NodeDef.RelationTypeId;
            //Just done one group for demonstration purposes
            //&& a.RelationTypeId.Equals(RelationType)
            //Has value
            GroupRels = db.GroupRoleRelations.FirstOrDefault(a => a.ApprovalProcessId ==ApprovalProcessId && a.MasterGroupId == MasterGroupId && a.RelationTypeId.Equals(RelationType));
            RelativeGroupId = (int)GroupRels.RelativeGroupId;

            reviewTask = new ReviewTask();
            TA = new TaskAssignment();
            TN = new TaskNode();

            reviewTask.ApprovalProcessType = ApprovalProcessId;
            reviewTask.RaiserUserId = RaiserUserId;
            reviewTask.Status = "I";
            reviewTask.DateUpdated = System.DateTime.Today;

            db.ReviewTasks.Add(reviewTask);
            db.SaveChanges();

            TA.AccessType = AccessType.ToString();
            TA.DateAssigned = System.DateTime.Today;
            TA.GroupId = RelativeGroupId;
            TA.TaskId = reviewTask.TaskId;
            TA.NodeId = NodeId;
            db.TaskAssignments.Add(TA);

            TN.NodeId = NodeId;
            TN.GroupId = RelativeGroupId;
            TN.TaskId = reviewTask.TaskId;
            TN.DateUpdated = System.DateTime.Today;
            db.TaskNodes.Add(TN);

            db.SaveChanges();

            //Should really return a success/fail indicator here
        }