PIbd-22_Aleikin_A.M._Confec.../Confectionery/ConfectioneryDatabaseImplement/Models/Pastry.cs

117 lines
3.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using ConfectioneryContracts.BindingModels;
using ConfectioneryContracts.ViewModels;
using ConfectioneryDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Net;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace ConfectioneryDatabaseImplement.Models
{
[DataContract]
public class Pastry : IPastryModel
{
[DataMember]
public int Id { get; private set; }
[Required]
[DataMember]
public string PastryName { get; private set; } = string.Empty;
[Required]
[DataMember]
public double Price { get; private set; }
private Dictionary<int, (IComponentModel, int)>? _pastryComponents = null;
[NotMapped]
[DataMember]
public Dictionary<int, (IComponentModel, int)> PastryComponents
{
get
{
if (_pastryComponents == null)
{
_pastryComponents = Components.ToDictionary(recPC => recPC.ComponentId, recPC =>
(recPC.Component as IComponentModel, recPC.Count));
}
return _pastryComponents;
}
}
[ForeignKey("PastryId")]
public virtual List<PastryComponent> Components { get; set; } = new();
[ForeignKey("PastryId")]
public virtual List<Order> Orders { get; set; } = new();
public static Pastry? Create(ConfectioneryDatabase context ,PastryBindingModel? model)
{
if (model == null)
{
return null;
}
return new Pastry()
{
Id = model.Id,
PastryName = model.PastryName,
Price = model.Price,
Components = model.PastryComponents.Select(x => new PastryComponent
{
Component = context.Components.First(y => y.Id == x.Key),
Count = x.Value.Item2
}).ToList()
};
}
public void Update(PastryBindingModel? model)
{
PastryName = model.PastryName;
Price = model.Price;
}
public PastryViewModel GetViewModel => new()
{
Id = Id,
PastryName = PastryName,
Price = Price,
PastryComponents = PastryComponents
};
public void UpdateComponents(ConfectioneryDatabase context, PastryBindingModel model)
{
var PastryComponents = context.PastryComponents.Where(rec => rec.PastryId == model.Id).ToList();
if (PastryComponents != null && PastryComponents.Count > 0)
{ // удалили те, которых нет в модели
context.PastryComponents.RemoveRange(PastryComponents.Where(rec => !model.PastryComponents.ContainsKey(rec.ComponentId)));
context.SaveChanges();
// обновили количество у существующих записей
foreach (var updateComponent in PastryComponents)
{
updateComponent.Count = model.PastryComponents[updateComponent.ComponentId].Item2;
model.PastryComponents.Remove(updateComponent.ComponentId);
}
context.SaveChanges();
}
var Pastry = context.Pastries.First(x => x.Id == Id);
foreach (var pc in model.PastryComponents)
{
context.PastryComponents.Add(new PastryComponent
{
Pastry = Pastry,
Component = context.Components.First(x => x.Id == pc.Key),
Count = pc.Value.Item2
});
context.SaveChanges();
}
_pastryComponents = null;
}
}
}