public Models.SchedulingTable CreateSchedule(Guid semesterId, string name, string shortName, string HighlightColor, string logoUrl, bool isActive)
        {
            if (semesterId == null || semesterId == System.Guid.Empty)
            {
                throw new ArgumentNullException("semesterId");
            }

            Models.SchedulingTable schedule = new Models.SchedulingTable()
            {
                Id             = Guid.NewGuid(),
                SemesterId     = semesterId,
                Name           = name,
                ShortName      = shortName,
                HighlightColor = HighlightColor,
                LogoUrl        = logoUrl,
                Stage          = Models.SCHEDULE_STAGE.NEW,
                IsActive       = isActive,
                IsDeleted      = false,
                AddedStamp     = DateTime.UtcNow
            };


            Models.ScheduleEvent scheduleEvent = new Models.ScheduleEvent()
            {
                Id                = Guid.NewGuid(),
                Stage             = Models.SCHEDULE_STAGE.NEW,
                Timestamp         = DateTime.Now,
                SchedulingTableId = schedule.Id
            };

            this.DataContext.Insert <Models.SchedulingTable>(schedule);
            this.DataContext.Insert <Models.ScheduleEvent>(scheduleEvent);

            return(schedule);
        }
        protected void ChangeScheduleStage(Guid scheduleId, Models.SCHEDULE_STAGE stage)
        {
            Models.SchedulingTable schedule = this.GetById(scheduleId);

            if (schedule == null)
            {
                throw new InvalidOperationException($"Schedule ({scheduleId}) does not exist.");
            }

            if (!schedule.IsActive)
            {
                throw new InvalidOperationException($"Cannot change stage of Un-Actice Schedule ({scheduleId})");
            }

            if (schedule.IsDeleted)
            {
                throw new InvalidOperationException($"Cannot change stage of Deleted Schedule ({scheduleId})");
            }

            Models.ScheduleEvent scheduleEvent = new Models.ScheduleEvent()
            {
                Id                = Guid.NewGuid(),
                Stage             = stage,
                Timestamp         = DateTime.Now,
                SchedulingTableId = schedule.Id
            };

            this.DataContext.Insert <Models.ScheduleEvent>(scheduleEvent);

            schedule.Stage = stage;
            this.DataContext.Update <Models.SchedulingTable, Guid>(schedule, x => x.Stage);
        }