using CanteenContracts.BindingModels; using CanteenContracts.View; using CanteenDataModels.Models; using FluentNHibernate.Conventions.Inspections; using Microsoft.EntityFrameworkCore; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace CanteenDatabaseImplement.Models { public class Product : IProductModel { public int Id { get; set; } [Required] public string ProductName { get; set; } = string.Empty; [Required] public double Price { get; set; } [Required] public int ManagerId { get; set; } private Dictionary? _productCooks = null; [NotMapped] public Dictionary ProductCooks { get { if (_productCooks == null) { _productCooks = Cooks .ToDictionary(recPC => recPC.CookId, recPC => (recPC.Cook as ICookModel)); } return _productCooks; } } [ForeignKey("ProductId")] public virtual List Cooks { get; set; } = new(); [ForeignKey("ProductId")] public virtual List Lunches { get; set; } = new(); [ForeignKey("ProductId")] public virtual List Dishes { get; set; } = new(); public virtual Manager Manager { get; set; } public static Product Create(CanteenDatabase context, ProductBindingModel model) { return new Product { Id = model.Id, ProductName = model.ProductName, Price = model.Price, ManagerId = model.ManagerId, Cooks = model.ProductCooks.Select(x => new ProductCook { Cook = context.Cooks.First(y => y.Id == x.Key) }).ToList() }; } public void Update(ProductBindingModel model) { ProductName = model.ProductName; Price = model.Price; ManagerId = model.ManagerId; } public ProductViewModel GetViewModel => new() { Id = Id, ProductName = ProductName, Price = Price, ManagerId = ManagerId, ProductCooks = ProductCooks }; public void UpdateProductCooks(CanteenDatabase context, ProductBindingModel model) { var productCookers = context.ProductCook.Where(rec => rec.ProductId == model.Id).ToList(); if (productCookers.Count > 0) { context.ProductCook.RemoveRange(productCookers.Where(rec => !model.ProductCooks.ContainsKey(rec.CookId))); context.SaveChanges(); } foreach (var updateCook in productCookers) { model.ProductCooks.Remove(updateCook.CookId); } context.SaveChanges(); var product = context.Products.First(x => x.Id == Id); foreach (var pc in model.ProductCooks) { context.ProductCook.Add(new ProductCook { Product = product, Cook = context.Cooks.First(x => x.Id == pc.Key) }); context.SaveChanges(); } _productCooks = null; } } }