public void AddElement(TOBindingModel model) { using (var transaction = context.Database.BeginTransaction()) { try { var _TO = context.TOs.FirstOrDefault(record => record.TOName == model.TOName); if (_TO != null) { throw new Exception("Такое ТО уже существует."); } else { _TO = new TO { TOName = model.TOName, Price = model.Price }; } context.TOs.Add(_TO); context.SaveChanges(); var duplicates = model.TODetails .GroupBy(record => record.DetailId) .Select(record => new { detailId = record.Key, amount = record.Sum(rec => rec.Amount) }); foreach (var duplicate in duplicates) { context.TO_Details.Add(new TO_Detail { TOId = _TO.Id, DetailId = duplicate.detailId, Amount = duplicate.amount }); context.SaveChanges(); } transaction.Commit(); } catch (Exception) { transaction.Rollback(); throw; } } }
public void UpdateElement(TOBindingModel model) { using (var transaction = context.Database.BeginTransaction()) { try { var _TO = context.TOs .FirstOrDefault(record => record.TOName == model.TOName && record.Id != model.Id); if (_TO != null) { throw new Exception("Уже есть ТО с таким названием"); } _TO = context.TOs .FirstOrDefault(record => record.Id == model.Id); if (_TO == null) { throw new Exception("ТО не найдено"); } _TO.TOName = model.TOName; _TO.Price = model.Price; context.SaveChanges(); var IDs = model.TODetails.Select( record => record.DetailId) .Distinct(); var updateDetails = context.TO_Details.Where( record => record.TOId == model.Id && IDs.Contains(record.DetailId)); foreach (var updateDetail in updateDetails) { updateDetail.Amount = model.TODetails.FirstOrDefault(record => record.Id == updateDetail.Id).Amount; } context.SaveChanges(); context.TO_Details .RemoveRange(context.TO_Details .Where(record => record.TOId == model.Id && !IDs.Contains(record.DetailId))); context.SaveChanges(); var groupDetails = model.TODetails .Where(record => record.Id == 0) .GroupBy(record => record.DetailId) .Select(record => new { detailId = record.Key, amount = record.Sum(r => r.Amount) }); foreach (var groupDetail in groupDetails) { var detail = context.TO_Details .FirstOrDefault(record => record.TOId == model.Id && record.DetailId == groupDetail.detailId); if (detail != null) { detail.Amount += groupDetail.amount; context.SaveChanges(); } else { context.TO_Details.Add(new TO_Detail { TOId = model.Id, DetailId = groupDetail.detailId, Amount = groupDetail.amount }); context.SaveChanges(); } } transaction.Commit(); } catch (Exception) { transaction.Rollback(); throw; } } }