PIbd-22_Kamcharova_K.A_Reno.../RenovationWorkDatabaseImplement/Models/Repair.cs
2024-04-17 09:29:02 +04:00

103 lines
3.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RenovationWorkContracts.BindingModels;
using RenovationWorkContracts.ViewModels;
using RenovationWorkDataModels.Models;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
namespace RenovationWorkDatabaseImplement.Models
{
public class Repair : IRepairModel
{
public int Id { get; set; }
[Required]
public string RepairName { get; set; } = string.Empty;
[Required]
public double Price { get; set; }
private Dictionary<int, (IComponentModel, int)>? _repairComponents = null;
[NotMapped]
public Dictionary<int, (IComponentModel, int)> RepairComponents
{
get
{
if (_repairComponents == null)
{
_repairComponents = Components.ToDictionary(recPC => recPC.ComponentId, recPC =>
(recPC.Component as IComponentModel, recPC.Count));
}
return _repairComponents;
}
}
[ForeignKey("RepairId")]
public virtual List<RepairComponent> Components { get; set; } = new();
[ForeignKey("RepairId")]
public virtual List<Order> Orders { get; set; } = new();
public static Repair
Create(RenovationWorkDatabase context, RepairBindingModel model)
{
return new Repair()
{
Id = model.Id,
RepairName = model.RepairName,
Price = model.Price,
Components = model.RepairComponents.Select(x => new RepairComponent
{
Component = context.Components.First(y => y.Id == x.Key),
Count = x.Value.Item2
}).ToList()
};
}
public void Update(RepairBindingModel model)
{
RepairName = model.RepairName;
Price = model.Price;
}
public RepairViewModel GetViewModel => new()
{
Id = Id,
RepairName = RepairName,
Price = Price,
RepairComponents = RepairComponents
};
public void UpdateComponents(RenovationWorkDatabase context, RepairBindingModel model)
{
var repairComponents = context.RepairComponents.Where(rec => rec.RepairId == model.Id).ToList();
if (repairComponents != null && repairComponents.Count > 0)
{
context.RepairComponents.RemoveRange(repairComponents.Where(rec => !model.RepairComponents.ContainsKey(rec.ComponentId)));
context.SaveChanges();
foreach (var updateComponent in repairComponents)
{
updateComponent.Count = model.RepairComponents[updateComponent.ComponentId].Item2;
model.RepairComponents.Remove(updateComponent.ComponentId);
}
context.SaveChanges();
}
var repair = context.Repairs.First(x => x.Id == Id);
foreach (var pc in model.RepairComponents)
{
context.RepairComponents.Add(new RepairComponent
{
Repair = repair,
Component = context.Components.First(x => x.Id == pc.Key),
Count = pc.Value.Item2
});
context.SaveChanges();
}
_repairComponents = null;
}
}
}