using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using PrecastConcretePlantContracts.BindingModels; using PrecastConcretePlantContracts.ViewModels; namespace PrecastConcretePlantDatabaseImplement.Models { public class Reinforced : IReinforcedModel { public int Id { get; set; } [Required] public string ReinforcedName { get; set; } = string.Empty; [Required] public double Price { get; set; } private Dictionary? _ReinforcedComponents = null; [NotMapped]//заполняется при обращеии к гетвьюмодел public Dictionary ReinforcedComponents { get { if (_ReinforcedComponents == null) { _ReinforcedComponents = Components .ToDictionary(recPC => recPC.ComponentId, recPC => (recPC.Component as IComponentModel, recPC.Count)); } return _ReinforcedComponents; } } [ForeignKey("ReinforcedId")] //список записей класса-связи public virtual List Components { get; set; } = new(); [ForeignKey("ReinforcedId")] public virtual List Orders { get; set; } = new(); public static Reinforced Create(PrecastConcretePlantDatabase context, ReinforcedBindingModel model) { return new Reinforced() { Id = model.Id, ReinforcedName = model.ReinforcedName, Price = model.Price, Components = model.ReinforcedComponents.Select(x => new ReinforcedComponent { Component = context.Components.First(y => y.Id == x.Key), Count = x.Value.Item2 }).ToList() }; } public void Update(ReinforcedBindingModel model) { ReinforcedName = model.ReinforcedName; Price = model.Price; } public ReinforcedViewModel GetViewModel => new() { Id = Id, ReinforcedName = ReinforcedName, Price = Price, ReinforcedComponents = ReinforcedComponents }; //метод обновления списка связей(вместо контейнски) public void UpdateComponents(PrecastConcretePlantDatabase context, ReinforcedBindingModel model) { var ReinforcedComponents = context.ReinforcedComponents .Where(rec => rec.ReinforcedId == model.Id).ToList(); if (ReinforcedComponents != null && ReinforcedComponents.Count > 0) { //удаляем те, которых нет в модели context.ReinforcedComponents.RemoveRange(ReinforcedComponents .Where(rec => !model.ReinforcedComponents.ContainsKey(rec.ComponentId))); context.SaveChanges(); //обновляем кол-во у сущ-х записей foreach (var updateComponent in ReinforcedComponents) { updateComponent.Count = model.ReinforcedComponents[updateComponent.ComponentId].Item2; model.ReinforcedComponents.Remove(updateComponent.ComponentId); } context.SaveChanges(); } var Reinforced = context.Reinforceds.First(x => x.Id == Id); foreach (var pc in model.ReinforcedComponents) { context.ReinforcedComponents.Add(new ReinforcedComponent { Reinforced = Reinforced, Component = context.Components.First(x => x.Id == pc.Key), Count = pc.Value.Item2 }); context.SaveChanges(); } _ReinforcedComponents = null; } } }