using PlumbingRepairContracts.BindingModels; using PlumbingRepairContracts.ViewModels; using PlumbingRepairDataModels.Models; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Runtime.Serialization; namespace PlumbingRepairDatabaseImplement.Models { [DataContract] public class Work : IWorkModel { [DataMember] public int Id { get; set; } [Required] [DataMember] public string WorkName { get; set; } = string.Empty; [Required] [DataMember] public double Price { get; set; } private Dictionary? _workComponents = null; [NotMapped] public Dictionary WorkComponents { get { if (_workComponents == null) { _workComponents = Components .ToDictionary(recPC => recPC.ComponentId, recPC => (recPC.Component as IComponentModel, recPC.Count)); } return _workComponents; } } [ForeignKey("WorkId")] public virtual List Components { get; set; } = new(); [ForeignKey("WorkId")] public virtual List Orders { get; set; } = new(); public static Work Create(PlumbingRepairDatabase context, WorkBindingModel model) { return new Work() { Id = model.Id, WorkName = model.WorkName, Price = model.Price, Components = model.WorkComponents.Select(x => new WorkComponent { Component = context.Components.First(y => y.Id == x.Key), Count = x.Value.Item2 }).ToList() }; } public void Update(WorkBindingModel model) { WorkName = model.WorkName; Price = model.Price; } public WorkViewModel GetViewModel => new() { Id = Id, WorkName = WorkName, Price = Price, WorkComponents = WorkComponents }; public void UpdateComponents(PlumbingRepairDatabase context, WorkBindingModel model) { var workComponents = context.WorkComponents.Where(rec => rec.WorkId == model.Id).ToList(); if (workComponents != null && workComponents.Count > 0) { // удалили те, которых нет в модели context.WorkComponents.RemoveRange(workComponents.Where(rec => !model.WorkComponents.ContainsKey(rec.ComponentId))); context.SaveChanges(); // обновили количество у существующих записей foreach (var updateComponent in workComponents) { updateComponent.Count = model.WorkComponents[updateComponent.ComponentId].Item2; model.WorkComponents.Remove(updateComponent.ComponentId); } context.SaveChanges(); } var work = context.Works.First(x => x.Id == Id); foreach (var pc in model.WorkComponents) { context.WorkComponents.Add(new WorkComponent { Work = work, Component = context.Components.First(x => x.Id == pc.Key), Count = pc.Value.Item2 }); context.SaveChanges(); } _workComponents = null; } } }