using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using RenovationWorkContracts.BindingModels; using RenovationWorkContracts.ViewModels; using RenovationWorkDataModels.Models; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; namespace RenovationWorkDatabaseImplement.Models { public class Repair : IRepairModel { public int Id { get; set; } [Required] public string RepairName { get; set; } = string.Empty; [Required] public double Price { get; set; } private Dictionary? _repairComponents = null; [NotMapped] public Dictionary RepairComponents { get { if (_repairComponents == null) { _repairComponents = Components.ToDictionary(recPC => recPC.ComponentId, recPC => (recPC.Component as IComponentModel, recPC.Count)); } return _repairComponents; } } [ForeignKey("RepairId")] public virtual List Components { get; set; } = new(); [ForeignKey("RepairId")] public virtual List Orders { get; set; } = new(); public static Repair Create(RenovationWorkDatabase context, RepairBindingModel model) { return new Repair() { Id = model.Id, RepairName = model.RepairName, Price = model.Price, Components = model.RepairComponents.Select(x => new RepairComponent { Component = context.Components.First(y => y.Id == x.Key), Count = x.Value.Item2 }).ToList() }; } public void Update(RepairBindingModel model) { RepairName = model.RepairName; Price = model.Price; } public RepairViewModel GetViewModel => new() { Id = Id, RepairName = RepairName, Price = Price, RepairComponents = RepairComponents }; public void UpdateComponents(RenovationWorkDatabase context, RepairBindingModel model) { var repairComponents = context.RepairComponents.Where(rec => rec.RepairId == model.Id).ToList(); if (repairComponents != null && repairComponents.Count > 0) { context.RepairComponents.RemoveRange(repairComponents.Where(rec => !model.RepairComponents.ContainsKey(rec.ComponentId))); context.SaveChanges(); foreach (var updateComponent in repairComponents) { updateComponent.Count = model.RepairComponents[updateComponent.ComponentId].Item2; model.RepairComponents.Remove(updateComponent.ComponentId); } context.SaveChanges(); } var repair = context.Repairs.First(x => x.Id == Id); foreach (var pc in model.RepairComponents) { context.RepairComponents.Add(new RepairComponent { Repair = repair, Component = context.Components.First(x => x.Id == pc.Key), Count = pc.Value.Item2 }); context.SaveChanges(); } _repairComponents = null; } } }