using BarContracts.BindingModels; using BarContracts.ViewModels; using BarDataModels.Models; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Runtime.Serialization; namespace BarDatabaseImplement.Models { [DataContract] public class Cocktail : ICocktailModel { [DataMember] public int Id { get; set; } [DataMember] [Required] public string CocktailName { get; set; } = string.Empty; [DataMember] [Required] public double Price { get; set; } private Dictionary? _cocktailComponents = null; [DataMember] [NotMapped] public Dictionary CocktailComponents { get { if (_cocktailComponents == null) { _cocktailComponents = Components.ToDictionary(recDC => recDC.ComponentId, recDC => (recDC.Component as IComponentModel, recDC.Count)); } return _cocktailComponents; } } [ForeignKey("CocktailId")] public virtual List Components { get; set; } = new(); [ForeignKey("CocktailId")] public virtual List Orders { get; set; } = new(); public static Cocktail Create(BarDatabase context, CocktailBindingModel model) { return new Cocktail() { Id = model.Id, CocktailName = model.CocktailName, Price = model.Price, Components = model.CocktailComponents.Select(x => new CocktailComponent { Component = context.Components.First(y => y.Id == x.Key), Count = x.Value.Item2 }).ToList() }; } public void Update(CocktailBindingModel model) { CocktailName = model.CocktailName; Price = model.Price; } public CocktailViewModel GetViewModel => new() { Id = Id, CocktailName = CocktailName, Price = Price, CocktailComponents = CocktailComponents }; public void UpdateComponents(BarDatabase context, CocktailBindingModel model) { var cocktailComponents = context.CocktailComponents.Where(rec => rec.CocktailId == model.Id).ToList(); if (cocktailComponents != null && cocktailComponents.Count > 0) { context.CocktailComponents.RemoveRange(cocktailComponents.Where(rec => !model.CocktailComponents.ContainsKey(rec.ComponentId))); context.SaveChanges(); foreach (var updateComponent in cocktailComponents) { updateComponent.Count = model.CocktailComponents[updateComponent.ComponentId].Item2; model.CocktailComponents.Remove(updateComponent.ComponentId); } context.SaveChanges(); } var cocktail = context.Cocktails.First(x => x.Id == Id); foreach (var pc in model.CocktailComponents) { context.CocktailComponents.Add(new CocktailComponent { Cocktail = cocktail, Component = context.Components.First(x => x.Id == pc.Key), Count = pc.Value.Item2 }); context.SaveChanges(); } _cocktailComponents = null; } } }