/// <summary>
        /// Executes the NewCourseSchedule business operation.
        /// </summary>
        public async virtual Task <NewCourseScheduleBusinessResponse> NewCourseSchedule(IDatabaseConnection databaseConnection, NewCourseScheduleBusinessRequest businessRequest)
        {
            // Validate the business request.
            this.ValidateNewCourseScheduleRequest(businessRequest);

            // Initialize the operation data.
            NewCourseScheduleOperationData operationData = new NewCourseScheduleOperationData();

            // Validate the business operation.
            await this.ValidateNewCourseScheduleOperation(databaseConnection, businessRequest, operationData);

            // Generate a unique CourseSchedule code.
            string courseScheduleCode = this.uniqueTokenGenerator.GenerateUniqueToken();

            // Create the CourseSchedule data row.
            operationData.CourseScheduleDataRow = new CourseScheduleDataRow();
            operationData.CourseScheduleDataRow.CourseScheduleCode = courseScheduleCode;
            operationData.CourseScheduleDataRow.SessionID          = operationData.SessionDataRow.SessionID;
            operationData.CourseScheduleDataRow.DayOfWeek          = (int)businessRequest.CourseSchedule.DayOfWeek;
            operationData.CourseScheduleDataRow.Time = businessRequest.CourseSchedule.Time;
            await this.courseScheduleDataAccessComponent.Create(databaseConnection, operationData.CourseScheduleDataRow);

            // Generate the unique CourseGroup codes.
            operationData.CourseGroupCodes = new string[businessRequest.CourseSchedule.CourseGroups.Length];
            for (int courseGroupIndex = 0; courseGroupIndex < businessRequest.CourseSchedule.CourseGroups.Length; courseGroupIndex++)
            {
                string courseGroupCode = this.uniqueTokenGenerator.GenerateUniqueToken();
                operationData.CourseGroupCodes[courseGroupIndex] = courseGroupCode;
            }

            // Create the CourseGroup data rows.
            for (int courseGroupIndex = 0; courseGroupIndex < businessRequest.CourseSchedule.CourseGroups.Length; courseGroupIndex++)
            {
                CourseGroupDataRow courseGroupDataRow = new CourseGroupDataRow();
                courseGroupDataRow = new CourseGroupDataRow();
                courseGroupDataRow.CourseGroupCode  = operationData.CourseGroupCodes[courseGroupIndex];
                courseGroupDataRow.CourseScheduleID = operationData.CourseScheduleDataRow.CourseScheduleID;
                courseGroupDataRow.PlacesCount      = businessRequest.CourseSchedule.CourseGroups[courseGroupIndex].PlacesCount;
                await this.courseGroupDataAccessComponent.Create(databaseConnection, courseGroupDataRow);
            }

            // Build the business response.
            NewCourseScheduleBusinessResponse businessResponse = new NewCourseScheduleBusinessResponse();

            // Build the CourseSchedule business response element.
            NewCourseScheduleBusinessResponse.CourseScheduleBusinessResponseElement courseScheduleBusinessResponseElement = new NewCourseScheduleBusinessResponse.CourseScheduleBusinessResponseElement();
            courseScheduleBusinessResponseElement.CourseScheduleCode = operationData.CourseScheduleDataRow.CourseScheduleCode;
            businessResponse.CourseSchedule = courseScheduleBusinessResponseElement;

            // Build the CourseGroup business response elements.
            List <NewCourseScheduleBusinessResponse.CourseScheduleBusinessResponseElement.CourseGroupBusinessResponseElement> courseGroupBusinessResponseElements = new List <NewCourseScheduleBusinessResponse.CourseScheduleBusinessResponseElement.CourseGroupBusinessResponseElement>();

            for (int courseGroupIndex = 0; courseGroupIndex < businessRequest.CourseSchedule.CourseGroups.Length; courseGroupIndex++)
            {
                NewCourseScheduleBusinessResponse.CourseScheduleBusinessResponseElement.CourseGroupBusinessResponseElement courseGroupBusinessResponseElement = new NewCourseScheduleBusinessResponse.CourseScheduleBusinessResponseElement.CourseGroupBusinessResponseElement();
                courseGroupBusinessResponseElement.CourseGroupCode = operationData.CourseGroupCodes[courseGroupIndex];
                courseGroupBusinessResponseElements.Add(courseGroupBusinessResponseElement);
            }

            // Set the CourseGroup business response elements.
            courseScheduleBusinessResponseElement.CourseGroups = courseGroupBusinessResponseElements.ToArray();

            // Return the business response.
            return(businessResponse);
        }
        /// <summary>
        /// Validates the NewCourseSchedule business operation.
        /// </summary>
        private async Task ValidateNewCourseScheduleOperation(IDatabaseConnection databaseConnection, NewCourseScheduleBusinessRequest businessRequest, NewCourseScheduleOperationData operationData)
        {
            // Validate the InvalidSessionCode error code.
            operationData.SessionDataRow = await this.sessionDataAccessComponent.ReadBySessionCode(databaseConnection, businessRequest.Session.SessionCode);

            if (operationData.SessionDataRow == null)
            {
                // Throw a NewCourseSchedule business exception.
                NewCourseScheduleBusinessException businessException = this.BuildNewCourseScheduleBusinessException(NewCourseScheduleBusinessException.ErrorCodes.InvalidSessionCode, businessRequest.Session.SessionCode);
                throw businessException;
            }
        }