我目前在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);
答案 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;
}