public void UpdateRoutine(RoutineDetails routine)
        {
            var workoutIds = routine.Workouts.Select(w => w.Id).ToArray();

            using (var conn = CreateConnection())
                using (var tran = conn.BeginTransaction())
                {
                    try
                    {
                        conn.Execute("DELETE FROM RoutineExercise WHERE RoutineWorkoutId IN (SELECT Id FROM RoutineWorkout WHERE RoutineId=@Id)", new { routine.Id }, tran);
                        conn.Execute("DELETE FROM RoutineWorkout WHERE RoutineId=@Id", new { routine.Id }, tran);

                        for (var i = 0; i < routine.Workouts.Length; i++)
                        {
                            var workout = routine.Workouts[i];
                            if (workout.Id == Guid.Empty)
                            {
                                workout.Id = Guid.NewGuid();
                            }
                            conn.Execute("INSERT INTO RoutineWorkout(Id,RoutineId,[Index],Name,Frequency) VALUES(@Id,@RoutineId,@Index,@Name,@Frequency)", new
                            {
                                workout.Id,
                                RoutineId = routine.Id,
                                Index     = i,
                                workout.Name,
                                workout.Frequency
                            }, tran);
                        }

                        conn.Execute("UPDATE Routine SET Name=@Name WHERE Id=@Id", routine, tran);

                        conn.Execute("INSERT INTO RoutineExercise(Id,RoutineWorkoutId,[Index],ExerciseId,Sets,Reps,LoadFrom,LoadTo) VALUES(newid(),@RoutineWorkoutId,@Index,@ExerciseId,@Sets,@Reps,@LoadFrom,@LoadTo)", routine.Workouts.SelectMany(w => w.Exercises.Select((e, i) => new
                        {
                            RoutineWorkoutId = w.Id,
                            Index            = i,
                            e.ExerciseId,
                            e.Sets,
                            e.Reps,
                            e.LoadFrom,
                            e.LoadTo
                        })), tran);

                        tran.Commit();
                    }
                    catch
                    {
                        for (var i = 0; i < routine.Workouts.Length; i++)
                        {
                            routine.Workouts[i].Id = workoutIds[i];
                        }
                        tran.Rollback();
                        throw;
                    }
                }
        }
        public void CreateRoutine(RoutineDetails routine)
        {
            routine.Id      = Guid.NewGuid();
            routine.Created = DateTimeOffset.Now;
            foreach (var workout in routine.Workouts)
            {
                workout.Id = Guid.NewGuid();
            }
            using (var conn = CreateConnection())
                using (var tran = conn.BeginTransaction())
                {
                    try
                    {
                        conn.Execute("INSERT INTO Routine(Id, UserId, Name,Created,Active) VALUES(@Id, @UserId, @Name,@Created,@Active)", routine, tran);
                        conn.Execute("INSERT INTO RoutineWorkout(Id,RoutineId,[Index],Name,Frequency) VALUES(@Id,@RoutineId,@Index,@Name,@Frequency)", routine.Workouts.Select((w, i) => new
                        {
                            w.Id,
                            RoutineId = routine.Id,
                            Index     = i,
                            w.Name,
                            w.Frequency
                        }), tran);
                        conn.Execute("INSERT INTO RoutineExercise(Id,RoutineWorkoutId,[Index],ExerciseId,Sets,Reps,LoadFrom,LoadTo) VALUES(newid(),@RoutineWorkoutId,@Index,@ExerciseId,@Sets,@Reps,@LoadFrom,@LoadTo)", routine.Workouts.SelectMany(w => w.Exercises.Select((e, i) => new
                        {
                            RoutineWorkoutId = w.Id,
                            Index            = i,
                            e.ExerciseId,
                            e.Sets,
                            e.Reps,
                            e.LoadFrom,
                            e.LoadTo
                        })), tran);

                        tran.Commit();
                    }
                    catch
                    {
                        routine.Id = Guid.Empty;
                        foreach (var workout in routine.Workouts)
                        {
                            workout.Id = Guid.Empty;
                        }
                        tran.Rollback();
                        throw;
                    }
                }
        }
 public void RestoreRoutine(Guid id, out RoutineDetails routine)
 {
     throw new NotImplementedException();
 }