public void AddTask(Task task)
        {
            task.CreatedDate = _dateTime.UtcNow;

            using (TaskManagementDbContext context = new TaskManagementDbContext())
            {
                task.Status = context.Status.Where(x => x.Name == "Not Started").SingleOrDefault();

                task.CreatedBy = context.Users.Where(x => x.Username == _userSession.UserName).SingleOrDefault();
                //task.CreatedBy = context.User.Find(1); // HACK: All tasks created by user 1 for now

                if (task.Users != null && task.Users.Any())
                {
                    for (var i = 0; i < task.Users.Count; ++i)
                    {
                        var user          = task.Users[i];
                        var persistedUser = context.Users.Find(user.UserId);
                        if (persistedUser == null)
                        {
                            throw new ChildObjectNotFoundException("User not found");
                        }

                        task.Users[i] = persistedUser;
                    }
                }
                context.Tasks.Add(task);
                context.SaveChanges();
            }
        }
        public Task DeleteTaskUsers(long taskId)
        {
            using (TaskManagementDbContext context = new TaskManagementDbContext())
            {
                var task = GetValidTask(context, taskId);

                UpdateTaskUsers(context, task, null, false);

                context.SaveChanges();

                return(task);
            }
        }
        public Task ReplaceTaskUsers(long taskId, IEnumerable <long> userIds)
        {
            using (TaskManagementDbContext context = new TaskManagementDbContext())
            {
                var task = GetValidTask(context, taskId);

                UpdateTaskUsers(context, task, userIds, false);

                context.SaveChanges();

                return(task);
            }
        }
        public Task AddTaskUser(long taskId, long userId)
        {
            using (TaskManagementDbContext context = new TaskManagementDbContext())
            {
                var task = GetValidTask(context, taskId);

                UpdateTaskUsers(context, task, new[] { userId }, true);

                // context.Tasks.Attach(task);
                //  context.Entry(task).State = EntityState.Modified;
                context.SaveChanges();

                return(task);
            }
        }
        public void UpdateTaskStatus(Task taskToUpdate, string statusName)
        {
            using (TaskManagementDbContext context = new TaskManagementDbContext())
            {
                var status = context.Status.Where(x => x.Name == statusName).SingleOrDefault();

                taskToUpdate.Status   = status;
                taskToUpdate.StatusId = status.StatusId;
                // context.Tasks.Attach(taskToUpdate);
                // context.Entry(taskToUpdate).State = EntityState.Modified;

                var entity = context.Tasks.Find(taskToUpdate.TaskId);
                context.Entry(entity).CurrentValues.SetValues(taskToUpdate);

                context.SaveChanges();
            }
        }
        public Task DeleteTaskUser(long taskId, long userId)
        {
            using (TaskManagementDbContext context = new TaskManagementDbContext())
            {
                var task = GetValidTask(context, taskId);

                var user = task.Users.FirstOrDefault(x => x.UserId == userId);

                if (user != null)
                {
                    task.Users.Remove(user);
                    // context.Tasks.Attach(task);
                    //  context.Entry(task).State = EntityState.Modified;
                    context.SaveChanges();
                }
                return(task);
            }
        }
        public Task GetUpdatedTask(long taskId, Dictionary <string, object> updatedPropertyValueMap)
        {
            using (TaskManagementDbContext context = new TaskManagementDbContext())
            {
                var task = GetValidTask(context, taskId);

                var propertyInfos = typeof(Task).GetProperties();
                foreach (var propertyValuePair in updatedPropertyValueMap)
                {
                    propertyInfos.Single(x => x.Name == propertyValuePair.Key)
                    .SetValue(task, propertyValuePair.Value);
                }

                context.SaveChanges();

                return(task);
            }
        }