using PolyclinicContracts.BindingModels; using PolyclinicContracts.ViewModels; using PolyclinicDataModels.Models; using SecuritySystemDatabaseImplement; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace PolyclinicDatabaseImplement.Models { public class Recipe : IRecipeModel { public int Id { get; set; } [Required] public int ProceduresCount { get; set; } public string Comment { get; set; } = string.Empty; public int? CourseId { get; set; } public virtual Course Course { get; set; } = new(); private Dictionary? _recipeProcedures = null; [ForeignKey("RecipeId")] public virtual List Procedures { get; set; } = new(); [NotMapped] public Dictionary RecipeProcedures { get { if (_recipeProcedures == null) { _recipeProcedures = Procedures.ToDictionary(recPC => recPC.ProcedureId, recPC => (recPC.Procedure as IProcedureModel)); } return _recipeProcedures; } } public static Recipe Create(PolyclinicDatabase database, RecipeBindingModel bindingModel) { return new Recipe() { Id = bindingModel.Id, ProceduresCount = bindingModel.ProceduresCount, Comment = bindingModel.Comment, CourseId = bindingModel.CourseId, Procedures = bindingModel.RecipeProcedures.Select(x => new RecipeProcedure { Recipe = database.Recipes.First(y => y.Id == x.Key) }).ToList() }; } public void Update(RecipeBindingModel bindingModel) { ProceduresCount = bindingModel.ProceduresCount; Comment = bindingModel.Comment; CourseId = bindingModel.CourseId; } public RecipeViewModel GetViewModel => new() { Id = Id, ProceduresCount = ProceduresCount, Comment = Comment, CourseId = Course?.Id ?? null, }; public void UpdateProcedures(PolyclinicDatabase database, RecipeBindingModel bindingModel) { var RecipeProcedures = database.RecipeProcedures.Where(x => x.ProcedureId == bindingModel.Id).ToList(); if (RecipeProcedures != null) { // удалили те, которых нет в модели database.RecipeProcedures.RemoveRange(RecipeProcedures.Where(rec => !bindingModel.RecipeProcedures.ContainsKey(rec.RecipeId))); database.SaveChanges(); } var Procedure = database.Procedures.First(x => x.Id == bindingModel.Id); foreach (var pc in bindingModel.RecipeProcedures) { database.RecipeProcedures.Add(new RecipeProcedure { Procedure = Procedure, Recipe = database.Recipes.First(x => x.Id == pc.Key) }); database.SaveChanges(); } _recipeProcedures = null; } } }