using SushiBarContracts.BindingModels; using SushiBarContracts.ViewModels; using SushiBarDataModels.Models; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Runtime.Serialization; namespace SushiBarDatabaseImplement.Models { [DataContract] public class Sushi : ISushiModel { [DataMember] public int Id { get; set; } [DataMember] [Required] public string SushiName { get; set; } = string.Empty; [DataMember] [Required] public double Price { get; set; } private Dictionary? _sushiComponents = null; [NotMapped] public Dictionary SushiComponents { get { if (_sushiComponents == null) { _sushiComponents = Components .ToDictionary(recPC => recPC.ComponentId, recPC => (recPC.Component as IComponentModel, recPC.Count)); } return _sushiComponents; } } [ForeignKey("SushiId")] public virtual List Components { get; set; } = new(); [ForeignKey("SushiId")] public virtual List Orders { get; set; } = new(); public static Sushi Create(SushiBarDatabase context, SushiBindingModel model) { return new Sushi() { Id = model.Id, SushiName = model.SushiName, Price = model.Price, Components = model.SushiComponents.Select(x => new SushiComponent { Component = context.Components.First(y => y.Id == x.Key), Count = x.Value.Item2 }).ToList() }; } public void Update(SushiBindingModel model) { SushiName = model.SushiName; Price = model.Price; } public SushiViewModel GetViewModel => new() { Id = Id, SushiName = SushiName, Price = Price, SushiComponents = SushiComponents }; public void UpdateComponents(SushiBarDatabase context, SushiBindingModel model) { var sushiComponents = context.SushiComponents.Where(rec => rec.SushiId == model.Id).ToList(); if (sushiComponents != null && sushiComponents.Count > 0) { // удалили те, которых нет в модели context.SushiComponents.RemoveRange(sushiComponents.Where(rec => !model.SushiComponents.ContainsKey(rec.ComponentId))); context.SaveChanges(); // обновили количество у существующих записей foreach (var updateComponent in sushiComponents) { updateComponent.Count = model.SushiComponents[updateComponent.ComponentId].Item2; model.SushiComponents.Remove(updateComponent.ComponentId); } context.SaveChanges(); } var sushi = context.Sushis.First(x => x.Id == Id); foreach (var pc in model.SushiComponents) { context.SushiComponents.Add(new SushiComponent { Sushi = sushi, Component = context.Components.First(x => x.Id == pc.Key), Count = pc.Value.Item2 }); context.SaveChanges(); } _sushiComponents = null; } } }