#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;
}