using HotelContracts.BindingModels; using HotelContracts.ViewModels; using HotelDataModels.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 HotelDataBaseImplement.Models { public class ConferenceBooking : IConferenceBookingModel { public int Id { get; private set; } public DateTime? DateСonference { get; set; } public int AdministratorId { get; private set; } public int? ConferenceId { get; private set; } [Required] public string PlaceСonference { get; set; } = string.Empty; public virtual Administrator Administrator { get; set; } public virtual Conference? Conference { get; set; } [ForeignKey("ConferenceBookingId")] public virtual List Dinners { get; set; } private Dictionary _conferenceBookingDinners = null; [NotMapped] public Dictionary ConferenceBookingDinners { get { if (_conferenceBookingDinners == null) { using var context = new HotelDataBase(); _conferenceBookingDinners = Dinners .ToDictionary(x => x.DinnerId, x => (context.Dinners .FirstOrDefault(y => y.Id == x.DinnerId)! as IDinnerModel)); } return _conferenceBookingDinners; } } public static ConferenceBooking Create(HotelDataBase context, ConferenceBookingBindingModel model) { return new ConferenceBooking() { Id = model.Id, ConferenceId = model.ConferenceId, AdministratorId = model.AdministratorId, PlaceСonference = model.PlaceСonference, Dinners = model.ConferenceBookingDinners.Select(x => new ConferenceBookingDinner { Dinner = context.Dinners.First(y => y.Id == x.Key), }).ToList() }; } public void Update(ConferenceBookingBindingModel model) { ConferenceId = model.ConferenceId; PlaceСonference = model.PlaceСonference; DateСonference = model.DateСonference; } public ConferenceBookingViewModel GetViewModel => new() { Id = Id, ConferenceId = ConferenceId, AdministratorId = AdministratorId, PlaceСonference = PlaceСonference, DateСonference = DateСonference, ConferenceBookingDinners = ConferenceBookingDinners }; public void UpdateDinners(HotelDataBase context, ConferenceBookingBindingModel model) { var conferenceBookingDinners = context.ConferenceBookingDinners.Where(rec => rec.ConferenceBookingId == model.Id).ToList(); if (conferenceBookingDinners != null && conferenceBookingDinners.Count > 0) { context.ConferenceBookingDinners.RemoveRange(conferenceBookingDinners.Where(rec => !model.ConferenceBookingDinners.ContainsKey(rec.DinnerId))); context.SaveChanges(); foreach (var updateDinner in conferenceBookingDinners) { model.ConferenceBookingDinners.Remove(updateDinner.DinnerId); } context.SaveChanges(); } var conferenceBooking = context.ConferenceBookings.First(x => x.Id == Id); foreach (var cm in model.ConferenceBookingDinners) { context.ConferenceBookingDinners.Add(new ConferenceBookingDinner { ConferenceBooking = conferenceBooking, Dinner = context.Dinners.First(x => x.Id == cm.Key) }); context.SaveChanges(); } _conferenceBookingDinners = null; } } }