Example #1
0
        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;
                }
            }
        }
Example #2
0
        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;
                }
            }
        }