Не удалось обновить данные в базе данных

#c# #asp.net-mvc #asp.net-core #entity-framework-core #asp.net-core-mvc

#c# #asp.net-mvc #asp.net-core #entity-framework-core #asp.net-core-mvc

Вопрос:

Я не понимаю, почему происходит эта ошибка. моя программа выглядит примерно так: -У меня есть коллекция многих данных в базе данных, а также указан тип данных сеанса. где идентификатор данных «сеанса» похож на идентификатор данных моей базы данных, там я изменяю количество, используя функциональность. но когда последний подсчет моего цикла изменил мое свойство количества (я отладил это), я обнаружил эту ошибку.

Вот мой код :

 public async Task<IActionResult> Checkout(Order11 anOrder)
{
    List<Shop> shop = HttpContext.Session.Get<List<Shop>>("shop");

    for (int i = 0; i < shop.Count; i  )
    {
        // var r = shop[i].Id;
        if (_db.Shop.Any(x => x.Id == shop[i].Id))
        {
            var t = _db.Shop.Where(x => x.Id == shop[i].Id).ToList();

            if (t[i].Quantity > 0)
            {
                t[i].Quantity = (t[i].Quantity - shop[i].Quantity) 
            }
               
            _db.SaveChanges();
        }
    }

    // other code
}
 

Вот мой вывод:

введите описание изображения здесь

Я не понимаю, каково решение этой проблемы. Я новичок. пожалуйста, помогите.

Ответ №1:

Рассмотрим, что здесь происходит:

 var t = _db.Shop.Where(x => x.Id == shop[i].Id).ToList();
 

Предполагая, что ваши идентификаторы уникальны, это приведет только к одному элементу, но вернет его как единственный элемент списка.

Таким образом, вы не хотите индексировать в t with t[i] . Вы просто хотите t[0] получить единственный элемент.

Однако все это можно сделать еще аккуратнее:

 for (int i = 0; i < shop.Count; i  )
{
     // Single() returns null for no match, the object for a single match
     // and throws an exception for multiple matches
     var t = _db.Shop.Single(x => x.Id == shop[i].Id);

     // ?. first checks if t is null, and only then looks at Quantity
     // if t is not null (i.e. Single() has returned a match)
     if (t?.Quantity > 0)
     {
         t.Quantity = (t.Quantity - shop[i].Quantity);

         _db.SaveChanges();
     }         
}
 

(Отдельная проблема, но я не уверен, что вам нужно _db.SaveChanges() вызывать внутри цикла. Почему бы просто не вызвать его один раз в конце?

Комментарии:

1. На самом деле, еще одна очистка будет t.Quantity -= shop[i].Quantity;

Ответ №2:

t это отфильтрованный список магазина, поэтому его количество меньше или равно shop.Count , вы не можете использовать i в качестве индекса для t .

Вы можете изменить свой код, как показано ниже.

   for (int i = 0; i < shop.Count; i  )
        {
            if (_db.Shop.Any(x => x.Id == shop[i].Id))
            {
                var t = _db.Shop.Where(x => x.Id == shop[i].Id).ToList();
                foreach (var x in t)
                {
                    if (x.Quantity > 0)
                    {
                        x.Quantity = (x.Quantity - shop[i].Quantity);
                    }
                }

                _db.SaveChanges();
            }
        }