ISEbd-21_Agliullov.D.A._Con.../ConfectioneryDatabaseImplement/Shop.cs
Данияр Аглиуллов 4afc9ccf6a Продвинутая часть
2023-03-08 21:37:50 +04:00

119 lines
4.2 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 ConfectioneryDatabaseImplement;
using ConfectioneryDataModels;
using ConfectioneryDataModels.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging.Abstractions;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Xml.Linq;
namespace ConfectioneryDatabaseImplement.Models
{
public class Shop : IShopModel
{
[Required]
public string Name { get; private set; } = string.Empty;
[Required]
public string Address { get; private set; } = string.Empty;
[Required]
public int MaxCountPastries { get; private set; }
public DateTime DateOpening { get; private set; }
private Dictionary<int, (IPastryModel, int)>? _cachedPastries = null;
[NotMapped]
public Dictionary<int, (IPastryModel, int)> Pastries
{
get
{
if (_cachedPastries == null)
{
using var context = new ConfectioneryDatabase();
_cachedPastries = ShopPastries
.ToDictionary(x => x.PastryId, x => (context.Pastries
.FirstOrDefault(y => y.Id == x.PastryId)! as IPastryModel, x.Count));
}
return _cachedPastries;
}
}
public int Id { get; private set; }
[ForeignKey("ShopId")]
public virtual List<ShopPastry> ShopPastries { get; set; } = new();
public static Shop? Create(ConfectioneryDatabase context, ShopBindingModel? model)
{
if (model == null)
{
return null;
}
return new Shop()
{
Id = model.Id,
Name = model.Name,
Address = model.Address,
DateOpening = model.DateOpening,
MaxCountPastries = model.MaxCountPastries,
ShopPastries = model.Pastries.Select(x => new ShopPastry
{
Pastry = context.Pastries.FirstOrDefault(y => y.Id == x.Key)!,
Count = x.Value.Item2,
}).ToList()
};
}
public void Update(ShopBindingModel? model)
{
if (model == null)
{
return;
}
Name = model.Name;
Address = model.Address;
DateOpening = model.DateOpening;
}
public ShopViewModel GetViewModel => new()
{
Id = Id,
Name = Name,
Address = Address,
Pastries = Pastries,
DateOpening = DateOpening,
MaxCountPastries = MaxCountPastries,
};
public void UpdatePastries(ConfectioneryDatabase context, ShopBindingModel model)
{
var shopPastries = context.ShopPastries
.Where(rec => rec.ShopId == model.Id)
.ToList();
// удалили те, которых нет в модели
if (shopPastries != null && shopPastries.Count > 0)
{
context.ShopPastries
.RemoveRange(shopPastries
.Where(rec => !model.Pastries
.ContainsKey(rec.PastryId)));
// обновили количество у существующих записей
foreach (var updatePastry in shopPastries.Where(x => model.Pastries.ContainsKey(x.PastryId)))
{
updatePastry.Count = model.Pastries[updatePastry.PastryId].Item2;
model.Pastries.Remove(updatePastry.PastryId);
}
}
var shop = context.Shops.First(x => x.Id == model.Id);
shop.ShopPastries.AddRange(model.Pastries.Select(x => new ShopPastry
{
Pastry = context.Pastries.First(y => y.Id == x.Key),
Count = x.Value.Item2,
}).Except(shopPastries ?? new()));
context.SaveChanges();
_cachedPastries = null;
}
}
}