using SchoolScheduleContracts.BindingModels; using SchoolScheduleContracts.ViewModels; using SchoolScheduleDataModels.Enums; using SchoolScheduleDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SchoolScheduleDataBaseImplement.Models { public class Student : IStudentModel { public int Id { get; private set; } [Required] public string FullName { get; private set; } [Required] public int GradeId { get; private set; } public virtual Grade Grade { get; set; } = new(); private Dictionary _attendance = null; [NotMapped] public Dictionary Attendance { get { if (_attendance == null) { _attendance = Lessons.ToDictionary(recPC => recPC.LessonId, recPC => (recPC.Lesson as ILessonModel, recPC.Status, recPC.Mark)); } return _attendance; } } [ForeignKey("StudentId")] public virtual List Lessons { get; set; } = new(); public static Student Create(SchoolScheduleDataBase context, StudentBindingModel model) { return new Student() { Id = model.Id, FullName = model.FullName, GradeId = model.GradeId, Grade = context.Grades.First(y => y.Id == model.GradeId), Lessons = model.Attendance.Select(x => new LessonStudent { Lesson = context.Lessons.First(y => y.Id == x.Key), Status = x.Value.Item2, Mark = x.Value.Item3, }).ToList(), }; } public void Update(SchoolScheduleDataBase context, StudentBindingModel model) { FullName = model.FullName; GradeId = model.GradeId; Grade = context.Grades.First(y => y.Id == model.GradeId); } public StudentViewModel GetViewModel => new() { Id = Id, FullName = FullName, GradeId = GradeId, GradeName = Grade.Year.ToString() + Grade.Letter.ToString(), }; public void UpdateAttendance(SchoolScheduleDataBase context, StudentBindingModel model) { var attendance = context.LessonStudents.Where(rec => rec.StudentId == model.Id).ToList(); if (attendance != null && attendance.Count > 0) { context.LessonStudents.RemoveRange(attendance.Where(rec => !model.Attendance.ContainsKey(rec.Id))); context.SaveChanges(); } var student = context.Students.First(x => x.Id == Id); foreach (var pc in model.Attendance) { context.LessonStudents.Add(new LessonStudent { Student = student, Lesson = context.Lessons.First(x => x.Id == pc.Key), Mark = pc.Value.Item3, Status = pc.Value.Item2, }); context.SaveChanges(); } _attendance = null; } } }