using DataModels; using DataModels.Models; using Contracts.BindingModels; using Contracts.ViewModels; using Contracts.SearchModels; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace DatabaseImplement.Models { public class Production : IProductionModel { public int Id { get; set; } [Required] public string Name { get; set; } = string.Empty; [Required] public double Cost { get; set; } [Required] public int UserId { get; set; } private Dictionary? _detailProductions = null; [NotMapped] public Dictionary? DetailProductions { get { if (_detailProductions == null) { _detailProductions = Details.ToDictionary(recDP => recDP.DetailId, recDp => recDp.Detail as IDetailModel); } return _detailProductions; } } [ForeignKey("ProductionId")] public virtual List Details { get; set; } = new(); public virtual Implementer User { get; set; } [ForeignKey("ProductionId")] public virtual List Workshops { get; set; } public static Production Create(FactoryGoWorkDatabase context, ProductionBindingModel model) { return new Production() { Id = model.Id, Name = model.Name, Cost = model.Cost, UserId = model.UserId, Details = model.ProductionDetails.Select(x => new DetailProduction { Detail = context.Details.First(y => y.Id == x.Key), }).ToList(), }; } public void Update(ProductionBindingModel model) { Name = model.Name; Cost = model.Cost; } public ProductionViewModel GetViewModel => new() { Id = Id, Name = Name, Cost = Cost, UserId = UserId, DetailProductions = DetailProductions }; public void UpdateDetails(FactoryGoWorkDatabase context, ProductionBindingModel model) { var productionDetails = context.DetailProductions.Where(rec => rec.ProductionId == model.Id).ToList(); if (productionDetails != null && productionDetails.Count > 0) { context.DetailProductions.RemoveRange(productionDetails.Where(rec => model.ProductionDetails.ContainsKey(rec.ProductionId))); context.SaveChanges(); } var production = context.Productions.First(x => x.Id == model.Id); foreach (var dp in model.ProductionDetails) { context.DetailProductions.Add(new DetailProduction { Production = production, Detail = context.Details.First(x => x.Id == dp.Key), }); context.SaveChanges(); } _detailProductions = null; } } }