using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Threading.Tasks; using VeterinaryClinicContracts.BindingModels; using VeterinaryClinicContracts.ViewModels; using VeterinaryClinicDataModels.Models; namespace VeterinaryClinicDatabaseImplement.Models { public class Medicine : IMedicineModel { public int Id { get; set; } [Required] public string MedicineName { get; set; } = string.Empty; [Required] public double Price { get; set; } private Dictionary? _MedicineMedications = null; [NotMapped] public Dictionary MedicineMedications { get { if (_MedicineMedications == null) { _MedicineMedications = Medications.ToDictionary(recPC => recPC.MedicationId, recPC => (recPC.Medication as IMedicationModel, recPC.Count)); } return _MedicineMedications; } } [ForeignKey("MedicineId")] public virtual List Medications { get; set; } = new(); [ForeignKey("MedicineId")] public virtual List Orders { get; set; } = new(); public static Medicine Create(VeterinaryClinicDatabase context, MedicineBindingModel model) { return new Medicine() { Id = model.Id, MedicineName = model.MedicineName, Price = model.Price, Medications = model.MedicineMedications.Select(x => new MedicineMedication { Medication = context.Medications.First(y => y.Id == x.Key), Count = x.Value.Item2 }).ToList() }; } public void Update(MedicineBindingModel model) { MedicineName = model.MedicineName; Price = model.Price; } public MedicineViewModel GetViewModel => new() { Id = Id, MedicineName = MedicineName, Price = Price, MedicineMedications = MedicineMedications }; public void UpdateMedications(VeterinaryClinicDatabase context, MedicineBindingModel model) { var MedicineMedications = context.MedicineMedications.Where(rec => rec.MedicineId == model.Id).ToList(); if (MedicineMedications != null && MedicineMedications.Count > 0) { context.MedicineMedications.RemoveRange(MedicineMedications.Where(rec => !model.MedicineMedications.ContainsKey(rec.MedicationId))); context.SaveChanges(); foreach (var updateMedication in MedicineMedications) { updateMedication.Count = model.MedicineMedications[updateMedication.MedicationId].Item2; model.MedicineMedications.Remove(updateMedication.MedicationId); } context.SaveChanges(); } var Medicine = context.Medicines.First(x => x.Id == Id); foreach (var pc in model.MedicineMedications) { context.MedicineMedications.Add(new MedicineMedication { Medicine = Medicine, Medication = context.Medications.First(x => x.Id == pc.Key), Count = pc.Value.Item2 }); context.SaveChanges(); } _MedicineMedications = null; } } }