From 605be259cced052eca90145fea8897842a641c79 Mon Sep 17 00:00:00 2001 From: urlilpolly Date: Sat, 27 Apr 2024 20:23:32 +0400 Subject: [PATCH] =?UTF-8?q?=D1=8F=20=D1=82=D1=83=D1=87=D0=B8=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D0=B3=D0=BE=D0=BD=D1=8E,=20=D0=A0=D0=A3=D0=9A?= =?UTF-8?q?=D0=90=D0=90=D0=90=D0=90=D0=9C=D0=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogic/GuarantorLogic.cs | 112 ++++++++++++++++++ .../BusinessLogic/MachineLogic.cs | 107 +++++++++++++++++ .../IGuarantorLogic.cs | 10 +- .../Contracts/ViewModels/MachineViewModel.cs | 1 + .../Contracts/ViewModels/WorkshopViewModel.cs | 1 + .../Implements/GuarantorStorage.cs | 72 +++++++++++ Course/DatabaseImplement/Models/Guarantor.cs | 70 +++++++++++ Course/DatabaseImplement/Models/Machine.cs | 68 ++++++++--- Course/DatabaseImplement/Models/Worker.cs | 73 ++++++++++++ .../DatabaseImplement/Models/WorkerMachine.cs | 7 +- .../Models/WorkerWorkshop.cs | 17 +++ Course/DatabaseImplement/Models/Workshop.cs | 100 ++++++++++++++++ 12 files changed, 608 insertions(+), 30 deletions(-) create mode 100644 Course/BusinessLogic/BusinessLogic/GuarantorLogic.cs create mode 100644 Course/BusinessLogic/BusinessLogic/MachineLogic.cs create mode 100644 Course/DatabaseImplement/Implements/GuarantorStorage.cs create mode 100644 Course/DatabaseImplement/Models/Guarantor.cs create mode 100644 Course/DatabaseImplement/Models/Worker.cs create mode 100644 Course/DatabaseImplement/Models/WorkerWorkshop.cs create mode 100644 Course/DatabaseImplement/Models/Workshop.cs diff --git a/Course/BusinessLogic/BusinessLogic/GuarantorLogic.cs b/Course/BusinessLogic/BusinessLogic/GuarantorLogic.cs new file mode 100644 index 0000000..8ad2985 --- /dev/null +++ b/Course/BusinessLogic/BusinessLogic/GuarantorLogic.cs @@ -0,0 +1,112 @@ +using Contracts.BindingModels; +using Contracts.BusinessLogicsContracts; +using Contracts.SearchModels; +using Contracts.StoragesContracts; +using Contracts.ViewModels; +using Microsoft.Extensions.Logging; + +namespace BusinessLogic.BusinessLogic +{ + public class GuarantorLogic : IGuarantorLogic + { + private readonly ILogger _logger; + private readonly IGuarantorStorage _storage; + + public GuarantorLogic(ILogger logger, IGuarantorStorage storage) + { + _logger = logger; + _storage = storage; + } + public List? ReadList(GuarantorSearchModel? model) + { + _logger.LogInformation("ReadList. Login:{Login}. Id:{Id}", model!.Login, model.Id); + var list = model == null ? _storage.GetFullList() : _storage.GetFilteredList(model); + if (list == null) + { + _logger.LogWarning("ReadList return null"); + return null; + } + return list; + } + public GuarantorViewModel? ReadElement(GuarantorSearchModel? model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation("ReadElement. Login:{Login}. Id:{Id}.", model.Login, model.Id); + var elem = _storage.GetElement(model); + if (elem == null) + { + _logger.LogWarning("ReadElement element not found"); + return null; + } + _logger.LogInformation("ReadElement find. Id:{Id}", elem.Id); + return elem; + } + private void CheckModel(GuarantorBindingModel? model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + return; + if (string.IsNullOrEmpty(model.Name)) + { + throw new ArgumentNullException("Нет имени пользователя", nameof(model)); + } + if (string.IsNullOrEmpty(model.Login)) + { + throw new ArgumentNullException("Нет логина пользователя", nameof(model)); + } + if (string.IsNullOrEmpty(model.Password)) + { + throw new ArgumentNullException("Нет пароля пользователя", nameof(model)); + } + if (string.IsNullOrEmpty(model.Email)) + { + throw new ArgumentNullException("Нет почты пользователя", nameof(model)); + } + var elem = _storage.GetElement(new GuarantorSearchModel + { + Login = model.Login + }); + if (elem != null && model.Id != elem.Id) + { + throw new InvalidOperationException("Такой логин уже используется в системе"); + } + } + public bool Create(GuarantorBindingModel? model) + { + CheckModel(model); + if (_storage.Insert(model!) == null) + { + _logger.LogWarning("Insert error"); + return false; + } + return true; + } + public bool Update(GuarantorBindingModel? model) + { + CheckModel(model); + if (_storage.Update(model!) == null) + { + _logger.LogWarning("Update error"); + return false; + } + return true; + } + public bool Delete(GuarantorBindingModel? model) + { + CheckModel(model, false); + _logger.LogInformation("Delete Guarantor. Id:{Id}", model!.Id); + if (_storage.Delete(model!) == null) + { + _logger.LogWarning("Delete error"); + return false; + } + return true; + } + } +} diff --git a/Course/BusinessLogic/BusinessLogic/MachineLogic.cs b/Course/BusinessLogic/BusinessLogic/MachineLogic.cs new file mode 100644 index 0000000..8f5345e --- /dev/null +++ b/Course/BusinessLogic/BusinessLogic/MachineLogic.cs @@ -0,0 +1,107 @@ +using Contracts.BindingModels; +using Contracts.BusinessLogicsContracts; +using Contracts.SearchModels; +using Contracts.StoragesContracts; +using Contracts.ViewModels; +using Microsoft.Extensions.Logging; + +namespace BusinessLogic.BusinessLogic +{ + public class MachineLogic : IMachineLogic + { + private readonly ILogger _logger; + private readonly IMachineStorage _machineStorage; + public ProductLogic(ILogger logger, IProductStorage productStorage) + { + _logger = logger; + _productStorage = productStorage; + } + public List? ReadList(ProductSearchModel? model) + { + _logger.LogInformation("ReadList. ProductName:{name}. Id:{Id}. UserId:{UserId}", model?.Name, model?.Id, model?.UserId); + var list = model == null ? _productStorage.GetFullList() : _productStorage.GetFilteredList(model); + if (list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + _logger.LogWarning("ReadList. Count:{Count}", list.Count); + return list; + } + public ProductViewModel? ReadElement(ProductSearchModel? model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation("ReadElement. ProductName:{Name}. Id:{Id}", model.Name, model.Id); + var elem = _productStorage.GetElement(model); + if (elem == null) + { + _logger.LogWarning("ReadElement element not found"); + return null; + } + _logger.LogInformation("ReadElement find. Id:{Id}", elem.Id); + return elem; + } + private void CheckModel(ProductBindingModel? model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.Name)) + { + throw new ArgumentNullException("Нет названия изделия", nameof(model.Name)); + } + if (model.Cost <= 0) + { + throw new ArgumentNullException("Цена изделия должна быть больше 0", nameof(model.Cost)); + } + _logger.LogInformation("Product. ProductName:{Name}. Cost:{Cost}. Id:{Id}", model.Name, model.Cost, model.Id); + var elem = _productStorage.GetElement(new ProductSearchModel + { + Name = model.Name + }); + if (elem != null && elem.Id != model.Id) + { + throw new InvalidOperationException("Изделие с таким названием уже существует"); + } + } + public bool Create(ProductBindingModel? model) + { + CheckModel(model); + if (_productStorage.Insert(model!) == null) + { + _logger.LogWarning("Insert error"); + return false; + } + return true; + } + public bool Update(ProductBindingModel? model) + { + CheckModel(model); + if (_productStorage.Update(model!) == null) + { + _logger.LogWarning("Update error"); + return false; + } + return true; + } + public bool Delete(ProductBindingModel? model) + { + CheckModel(model, false); + _logger.LogInformation("Delete Id:{Id}", model!.Id); + if (_productStorage.Delete(model!) == null) + { + _logger.LogWarning("Delete error"); + return false; + } + return true; + } + } +} diff --git a/Course/Contracts/BusinessLogicsContracts/IGuarantorLogic.cs b/Course/Contracts/BusinessLogicsContracts/IGuarantorLogic.cs index 7a8dca9..b66b198 100644 --- a/Course/Contracts/BusinessLogicsContracts/IGuarantorLogic.cs +++ b/Course/Contracts/BusinessLogicsContracts/IGuarantorLogic.cs @@ -6,10 +6,10 @@ namespace Contracts.BusinessLogicsContracts { public interface IGuarantorLogic { - List? ReadList(ImplementerSearchModel? model); - ImplementerViewModel? ReadElement(ImplementerSearchModel? model); - bool Create(ImplementerBindingModel? model); - bool Update(ImplementerBindingModel? model); - bool Delete(ImplementerBindingModel? model); + List? ReadList(GuarantorSearchModel? model); + GuarantorViewModel? ReadElement(GuarantorSearchModel? model); + bool Create(GuarantorBindingModel? model); + bool Update(GuarantorBindingModel? model); + bool Delete(GuarantorBindingModel? model); } } diff --git a/Course/Contracts/ViewModels/MachineViewModel.cs b/Course/Contracts/ViewModels/MachineViewModel.cs index 24e6794..49cd82b 100644 --- a/Course/Contracts/ViewModels/MachineViewModel.cs +++ b/Course/Contracts/ViewModels/MachineViewModel.cs @@ -12,5 +12,6 @@ namespace Contracts.ViewModels public string Country { get; set; } = string.Empty; public int UserId { get; set; } public int ProductId { get; set; } + public Dictionary? WorkerMachines { get; set; } } } diff --git a/Course/Contracts/ViewModels/WorkshopViewModel.cs b/Course/Contracts/ViewModels/WorkshopViewModel.cs index b71d506..358d929 100644 --- a/Course/Contracts/ViewModels/WorkshopViewModel.cs +++ b/Course/Contracts/ViewModels/WorkshopViewModel.cs @@ -14,5 +14,6 @@ namespace Contracts.ViewModels public string Director { get; set; } = string.Empty; public int UserId { get; set; } public int ProductionId { get; set; } + public Dictionary? WorkerWorkshops { get; set; } } } diff --git a/Course/DatabaseImplement/Implements/GuarantorStorage.cs b/Course/DatabaseImplement/Implements/GuarantorStorage.cs new file mode 100644 index 0000000..19409c6 --- /dev/null +++ b/Course/DatabaseImplement/Implements/GuarantorStorage.cs @@ -0,0 +1,72 @@ +using Contracts.BindingModels; +using Contracts.SearchModels; +using Contracts.StoragesContracts; +using Contracts.ViewModels; +using DatabaseImplement.Models; + +namespace DatabaseImplement.Implements +{ + public class GuarantorStorage : IGuarantorStorage + { + public GuarantorViewModel? Delete(GuarantorBindingModel model) + { + using var context = new FactoryGoWorkDatabase(); + var newGuarantor = context.Guarantors.FirstOrDefault(x => x.Id == model.Id); + if (newGuarantor == null) + return null; + context.Guarantors.Remove(newGuarantor); + context.SaveChanges(); + return newGuarantor.GetViewModel; + } + + public GuarantorViewModel? GetElement(GuarantorSearchModel model) + { + if (!model.Id.HasValue && string.IsNullOrEmpty(model.Login)) { return null; } + using var context = new FactoryGoWorkDatabase(); + return context.Guarantors.FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id) || (!string.IsNullOrEmpty(model.Login) && x.Login.Equals(model.Login)))?.GetViewModel; ; + } + + public List GetFilteredList(GuarantorSearchModel model) + { + if (!model.Id.HasValue && string.IsNullOrEmpty(model.Login)) + return new(); + using var context = new FactoryGoWorkDatabase(); + if (model.Id.HasValue) + { + return context.Guarantors.Where(x => x.Id == model.Id).Select(x => x.GetViewModel).ToList(); + } + else + { + return context.Guarantors.Where(x => x.Login.Equals(model.Login)).Select(x => x.GetViewModel).ToList(); + } + } + + public List GetFullList() + { + using var context = new FactoryGoWorkDatabase(); + return context.Guarantors.Select(x => x.GetViewModel).ToList(); + } + + public GuarantorViewModel? Insert(GuarantorBindingModel model) + { + using var context = new FactoryGoWorkDatabase(); + var newGuarantor = Guarantor.Create(model); + if (newGuarantor == null) + return null; + context.Guarantors.Add(newGuarantor); + context.SaveChanges(); + return newGuarantor.GetViewModel; + } + + public GuarantorViewModel? Update(GuarantorBindingModel model) + { + using var context = new FactoryGoWorkDatabase(); + var newGuarantor = context.Guarantors.FirstOrDefault(x => x.Id == model.Id); + if (newGuarantor == null) + return null; + newGuarantor.Update(model); + context.SaveChanges(); + return newGuarantor.GetViewModel; + } + } +} diff --git a/Course/DatabaseImplement/Models/Guarantor.cs b/Course/DatabaseImplement/Models/Guarantor.cs new file mode 100644 index 0000000..9373fa1 --- /dev/null +++ b/Course/DatabaseImplement/Models/Guarantor.cs @@ -0,0 +1,70 @@ +using Contracts.BindingModels; +using Contracts.ViewModels; +using DataModels.Models; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; + +namespace DatabaseImplement.Models +{ + public class Guarantor : IGuarantorModel + { + public int Id { get; set; } + [Required] + public string Email { get; set; } = string.Empty; + [Required] + public string Name { get; set; } = string.Empty; + [Required] + public string Login { get; set; } = string.Empty; + [Required] + public string Password { get; set; } = string.Empty; + [ForeignKey("UserId")] + public virtual List Machines { get; set; } = new(); + [ForeignKey("UserId")] + public virtual List Workers { get; set; } = new(); + [ForeignKey("UserId")] + public virtual List Workshops { get; set; } = new(); + + public static Guarantor? Create(GuarantorBindingModel model) + { + if (model == null) + { + return null; + } + return new Guarantor + { + Id = model.Id, + Email = model.Email, + Name = model.Name, + Login = model.Login, + Password = model.Password + }; + } + public static Guarantor Create(GuarantorViewModel model) + { + return new Guarantor + { + Id = model.Id, + Email = model.Email, + Name = model.Name, + Login = model.Login, + Password = model.Password + }; + } + public void Update(GuarantorBindingModel model) + { + if (model == null) + return; + Email = model.Email; + Name = model.Name; + Password = model.Password; + } + public GuarantorViewModel GetViewModel => new() + { + Id = Id, + Email = Email, + Name = Name, + Login = Login, + Password = Password + }; + } +} diff --git a/Course/DatabaseImplement/Models/Machine.cs b/Course/DatabaseImplement/Models/Machine.cs index 64527f9..65ecae6 100644 --- a/Course/DatabaseImplement/Models/Machine.cs +++ b/Course/DatabaseImplement/Models/Machine.cs @@ -24,14 +24,24 @@ namespace DatabaseImplement.Models [Required] public int ProductId { get; private set; } public virtual Product Product { get; set; } + private Dictionary? _workerMachines = null; + [NotMapped] + public Dictionary? WorkerMachines + { + get + { + if (_workerMachines == null) + { + _workerMachines = Workers.ToDictionary(recDP => recDP.WorkerId, recDp => (recDp.Worker as IWorkerModel, recDp.Count)); + } + return _workerMachines; + } + } [ForeignKey("WorkerId")] - public virtual List WorkerMachines { get; set; } = new(); + public virtual List Workers { get; set; } = new(); + public virtual Guarantor Guarantor { get; set; } public static Machine? Create(MachineBindingModel model, FactoryGoWorkDatabase context) { - if (model == null) - { - return null; - } return new Machine() { Id = model.Id, @@ -39,23 +49,15 @@ namespace DatabaseImplement.Models Country = model.Country, ProductId = model.ProductId, Product = context.Products.FirstOrDefault(x => x.Id == model.ProductId)!, - UserId = model.UserId - }; - } - public static Machine Create(MachineViewModel model) - { - return new Machine - { - Id = model.Id, - Title = model.Title, - Country = model.Country, - UserId = model.UserId + UserId = model.UserId, + Workers = model.MachineWorker.Select(x => new WorkerMachine + { + Worker = context.Workers.First(y => y.Id == x.Key), + }).ToList(), }; } public void Update(MachineBindingModel model) { - if (model == null) - return; Title = model.Title; Country = model.Country; } @@ -65,7 +67,35 @@ namespace DatabaseImplement.Models Title = Title, Country = Country, UserId = UserId, - ProductId = ProductId + ProductId = ProductId, + WorkerMachines = WorkerMachines }; + public void UpdateWorkers(FactoryGoWorkDatabase context, MachineBindingModel model) + { + var machineWorkers = context.WorkerMachines.Where(rec => rec.MachineId == model.Id).ToList(); + if (machineWorkers != null && machineWorkers.Count > 0) + { + context.WorkerMachines.RemoveRange(machineWorkers.Where(rec => !model.MachineWorker.ContainsKey(rec.WorkerId))); + context.SaveChanges(); + foreach (var upWorker in machineWorkers) + { + upWorker.Count = model.MachineWorker[upWorker.WorkerId].Item2; + model.MachineWorker.Remove(upWorker.WorkerId); + } + context.SaveChanges(); + } + var machine = context.Machines.First(x => x.Id == model.Id); + foreach (var dp in model.MachineWorker) + { + context.WorkerMachines.Add(new WorkerMachine + { + Machine = machine, + Worker = context.Workers.First(x => x.Id == dp.Key), + Count = dp.Value.Item2 + }); + context.SaveChanges(); + } + _workerMachines = null; + } } } diff --git a/Course/DatabaseImplement/Models/Worker.cs b/Course/DatabaseImplement/Models/Worker.cs new file mode 100644 index 0000000..6bce5eb --- /dev/null +++ b/Course/DatabaseImplement/Models/Worker.cs @@ -0,0 +1,73 @@ +using Contracts.BindingModels; +using Contracts.ViewModels; +using DataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DatabaseImplement.Models +{ + public class Worker : IWorkerModel + { + public int Id { get; set; } + [Required] + public string Name { get; set; } = string.Empty; + [Required] + public DateTime Birthday { get; set; } + [Required] + public string Specialization { get; set; } = string.Empty; + [Required] + public double Salary { get; set; } + [Required] + public int UserId { get; set; } + [ForeignKey("WorkerId")] + public virtual List WorkerMachines { get; set; } = new(); + [ForeignKey("WorkerId")] + public virtual List WorkerWorkshops { get; set; } = new(); + public virtual Guarantor Guarantor { get; set; } + public static Worker? Create(WorkerBindingModel model) + { + if (model == null) + { + return null; + } + return new Worker + { + Id = model.Id, + Name = model.Name, + Birthday = model.Birthday, + Specialization = model.Specialization, + Salary = model.Salary, + UserId = model.UserId + }; + } + public static Worker Create(WorkerViewModel model) + { + return new Worker + { + Id = model.Id, + Name = model.Name, + Birthday = model.Birthday, + Specialization = model.Specialization, + Salary = model.Salary, + UserId = model.UserId + }; + } + public void Update(WorkerBindingModel model) + { + if (model == null) + return; + Name = model.Name; + Specialization = model.Specialization; + Salary = model.Salary; + } + public WorkerViewModel GetViewModel => new() + { + Id = Id, + Name = Name, + Birthday = Birthday, + Specialization = Specialization, + Salary = Salary, + UserId = UserId + }; + } +} diff --git a/Course/DatabaseImplement/Models/WorkerMachine.cs b/Course/DatabaseImplement/Models/WorkerMachine.cs index 1e8b6b2..ed0d687 100644 --- a/Course/DatabaseImplement/Models/WorkerMachine.cs +++ b/Course/DatabaseImplement/Models/WorkerMachine.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; namespace DatabaseImplement.Models { diff --git a/Course/DatabaseImplement/Models/WorkerWorkshop.cs b/Course/DatabaseImplement/Models/WorkerWorkshop.cs new file mode 100644 index 0000000..cd417c1 --- /dev/null +++ b/Course/DatabaseImplement/Models/WorkerWorkshop.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; + +namespace DatabaseImplement.Models +{ + public class WorkerWorkshop + { + public int Id { get; set; } + [Required] + public int WorkerId { get; set; } + [Required] + public int WorkshopId { get; set; } + [Required] + public int Count { get; set; } + public virtual Worker Worker { get; set; } = new(); + public virtual Workshop Workshop { get; set; } = new(); + } +} diff --git a/Course/DatabaseImplement/Models/Workshop.cs b/Course/DatabaseImplement/Models/Workshop.cs new file mode 100644 index 0000000..c2777d2 --- /dev/null +++ b/Course/DatabaseImplement/Models/Workshop.cs @@ -0,0 +1,100 @@ +using Contracts.BindingModels; +using Contracts.ViewModels; +using DataModels.Models; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; + +namespace DatabaseImplement.Models +{ + public class Workshop : IWorkshopModel + { + public int Id { get; set; } + [Required] + public string Title { get; set; } = string.Empty; + [Required] + public string Address { get; set; } = string.Empty; + [Required] + public string Director { get; set; } = string.Empty; + [Required] + public int UserId { get; set; } + [Required] + public int ProductionId { get; set; } + public virtual Production Production { get; set; } + private Dictionary? _workerWorkshops = null; + [NotMapped] + public Dictionary? WorkerWorkshops + { + get + { + if(_workerWorkshops == null) + { + _workerWorkshops = Workers.ToDictionary(recDP => recDP.WorkerId, recDp => (recDp.Worker as IWorkerModel, recDp.Count)); + } + return _workerWorkshops; + } + } + [ForeignKey("WorkshopId")] + public List Workers { get; set; } = new(); + public virtual Guarantor Guarantor { get; set; } + public static Workshop Create(FactoryGoWorkDatabase context, WorkshopBindingModel model) + { + return new Workshop() + { + Id = model.Id, + Title = model.Title, + Address = model.Address, + Director = model.Director, + ProductionId = model.ProductionId, + Production = context.Productions.FirstOrDefault(x => x.Id == model.ProductionId)!, + UserId = model.UserId, + Workers = model.WorkshopWorker.Select(x => new WorkerWorkshop + { + Worker = context.Workers.First(y => y.Id == x.Key), + }).ToList(), + }; + } + public void Update(WorkshopBindingModel model) + { + Title = model.Title; + Address = model.Address; + Director = model.Director; + } + public WorkshopViewModel GetViewModel => new() + { + Id = Id, + Title = Title, + Address = Address, + Director = Director, + ProductionId= ProductionId, + UserId = UserId, + WorkerWorkshops = WorkerWorkshops + }; + public void UpdateWorkers(FactoryGoWorkDatabase context, WorkshopBindingModel model) + { + var workshopWorkers = context.WorkerWorkshops.Where(rec => rec.WorkshopId == model.Id).ToList(); + if (workshopWorkers != null && workshopWorkers.Count > 0) + { + context.WorkerWorkshops.RemoveRange(workshopWorkers.Where(rec => !model.WorkshopWorker.ContainsKey(rec.WorkerId))); + context.SaveChanges(); + foreach (var upWorker in workshopWorkers) + { + upWorker.Count = model.WorkshopWorker[upWorker.WorkerId].Item2; + model.WorkshopWorker.Remove(upWorker.WorkerId); + } + context.SaveChanges(); + } + var workshop = context.Workshops.First(x => x.Id == model.Id); + foreach (var dp in model.WorkshopWorker) + { + context.WorkerWorkshops.Add(new WorkerWorkshop + { + Workshop = workshop, + Worker = context.Workers.First(x => x.Id == dp.Key), + Count = dp.Value.Item2 + }); + context.SaveChanges(); + } + _workerWorkshops = null; + } + } +}