使用AJAX调用调试乐观并发

时间:2016-10-21 19:33:06

标签: asp.net asp.net-mvc concurrency

我目前在ASP.NET MVC应用程序中遇到乐观并发问题。

基本上,这个跟随控制器在被调用一次时工作正常。但是,我有一个页面可以同时修改六个不同组的居民。这是问题发生的地方。基本上,我为每个列表一次一个地发布一个居民列表,因此基本上有六个并发的ajax调用同时到达服务器。 (这可能是我需要改变的,但我不确定!)

javascript ajax调用会将该组的ID以及常驻ID列表发布。然后将居民添加到群组参考中。我一直在寻找刷新状态,但这不起作用,因为似乎只有六个组中的一个更新。我也试过让客户赢了。我真的需要一些解决这个问题的指导和建议!

这是我控制器中的当前代码:

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 个答案:

答案 0 :(得分:0)

我们不确定如何解决您所拥有的代码所遇到的问题,因此尝试简化它。看看这是否有帮助:

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