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; using UniversityContracts.BindingModels; using UniversityContracts.ViewModels; using UniversityDataModels.Models; namespace UniversityDatabaseImplement.Models { public class Discipline : IDisciplineModel { public int Id { get; private set; } [Required] public int UserId { get; private set; } [Required] public int TeacherId { get; private set; } [Required] public string Name { get; private set; } = string.Empty; [Required] public string Description { get; private set; } = string.Empty; public DateOnly Date { get; private set; } public virtual User User { get; set; } = new(); public virtual Teacher Teacher { get; set; } = new(); private Dictionary? _studentDisciplines = null; [NotMapped] public Dictionary StudentDisciplines { get { if (_studentDisciplines == null) { _studentDisciplines = Students .ToDictionary(recPC => recPC.StudentId, recPC => recPC.Student as IStudentModel); } return _studentDisciplines; } } [ForeignKey("DisciplineId")] public virtual List Students { get; set; } = new(); public static Discipline Create(UniversityDatabase context, DisciplineBindingModel model) { return new Discipline() { Id = model.Id, UserId = model.UserId, User = context.Users.First(x => x.Id == model.UserId), TeacherId = model.TeacherId, Teacher = context.Teachers.First(x => x.Id == model.TeacherId), Name = model.Name, Description = model.Description, Students = model.StudentDisciplines.Select(x => new StudentDiscipline { Student = context.Students.First(y => y.Id == x.Key) }).ToList() }; } public void Update(DisciplineBindingModel model) { if (model == null) { return; } Id = model.Id; TeacherId = model.TeacherId; Name = model.Name; Description = model.Description; } public void UpdateStudents(UniversityDatabase context, DisciplineBindingModel model) { var studentDisciplines = context.StudentDisciplines.Where(rec => rec.DisciplineId == model.Id).ToList(); if (studentDisciplines != null && studentDisciplines.Count > 0) { // удалили те, которых нет в модели context.StudentDisciplines.RemoveRange(studentDisciplines.Where(rec => !model.StudentDisciplines.ContainsKey(rec.StudentId))); context.SaveChanges(); // обновили количество у существующих записей foreach (var updateStudent in studentDisciplines) { model.StudentDisciplines.Remove(updateStudent.StudentId); } context.SaveChanges(); } var discipline = context.Disciplines.First(x => x.Id == Id); foreach (var pc in model.StudentDisciplines) { context.StudentDisciplines.Add(new StudentDiscipline { Discipline = discipline, Student = context.Students.First(x => x.Id == pc.Key) }); context.SaveChanges(); } _studentDisciplines = null; } public DisciplineViewModel GetViewModel => new() { Id = Id, UserId = UserId, TeacherId = TeacherId, TeacherName = Teacher.Name, Name = Name, Description = Description, StudentDisciplines = StudentDisciplines, }; } }