Отладка оптимистичного параллелизма с вызовом AJAX

#asp.net #asp.net-mvc #concurrency

#asp.net #asp.net-mvc #параллелизм

Вопрос:

В настоящее время у меня возникла проблема с оптимистичным параллелизмом в моем ASP.NET Приложение MVC.

По сути, этот следующий контроллер отлично работает при однократном вызове. Однако у меня есть страница, которая предназначена для одновременного изменения резидентов в шести разных группах. Вот где возникает проблема. По сути, я размещаю список резидентов по одному для каждого списка, так что, по сути, существует шесть одновременных вызовов ajax, которые поступают на сервер одновременно. (Возможно, это то, что мне нужно изменить, но я не уверен!)

Вызов javascript ajax отправляет идентификатор группы вместе со списком резидентных идентификаторов. Затем резиденты добавляются к ссылкам на группы. Я изучал возможность обновления состояния, но это не работает, поскольку, похоже, обновляется только одна из шести групп. Я попытался также позволить клиенту выиграть. Мне действительно просто нужны некоторые рекомендации и подсказки по решению этой проблемы!

Вот мой текущий код в моем контроллере:

 var group = _context.TherapyGroups.Include(r => r.Residents)
                                              .Where(x => x.ID.ToString() == groupid).FirstOrDefault();
            if(group == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            group.Residents.Clear();
            foreach(var id in residents)
            {
                var resident = _context.Residents.Where(x => x.ID.ToString() == id).FirstOrDefault();
                if(resident == null)
                {
                    throw new HttpResponseException(HttpStatusCode.NotFound);
                }
                group.Residents.Add(resident);
            }
            bool saveFailed;
            do
            {
                saveFailed = false;
                try
                {

                    _context.SaveChanges();
                }
                catch (DbUpdateException e)
                {
                    saveFailed = true;
                    ((IObjectContextAdapter)_context).ObjectContext.Refresh(RefreshMode.StoreWins, _context.Residents);
                }
            } while (saveFailed);
  

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

1. Только что заметил, что я обновлял _context.Residents . Я изменил _context на обновленный. TherapyGroups и это все еще не работает.

2. Вместо сохранения после завершения списка резидентов, почему бы не сохранить после добавления каждого резидента в список? Кроме того, используете ли вы контейнеры IoC для разрешения _context?

3. Я не использую IoC прямо сейчас.. У вас есть что-нибудь, указывающее мне на преимущества этого?

4. Нет, в этом нет необходимости, это было просто для того, чтобы указать мне, где может быть проблема.

Ответ №1:

Не был уверен, как исправить проблему, с которой вы столкнулись в имеющемся у вас коде, поэтому попытался немного упростить ее. Посмотрим, поможет ли это:

   var groupId = _context.TherapyGroups.FirstOrDefault(x => x.ID.ToString() == groupid).Select(x => x.ID);

  if(groupId == "") // or if(groupId == 0), not sure type of x.ID
  {
      throw new HttpResponseException(HttpStatusCode.NotFound);
  }

  // Get all of the residents whose Id is in the residents list
  var residentObjects = _context.Residents.Where(x => residents.Contains( x.ID.ToString()));

  // Update the groupId for each resident
  foreach(var resident in residentObjects)
  {
       resident.GroupId = groupId;
  }

  var saveFailed = false;
  try
  {
       _context.SaveChanges();
  }
  catch (DbUpdateException e)
  {
       saveFailed = true;
  }