【发布时间】:2021-01-25 06:02:58
【问题描述】:
我正在尝试实现一个控制器方法来重新排序需要使用 EF Core 保存在数据库中的图像索引。
我有以下控制器方法:
[HttpPost]
public async Task<JsonResult> ReorderImage(int p_iImageID, int p_iNewOrderIndex)
{
if (p_iImageID <= 0)
return Json(new { Status = "Error", Message = $"Unable to retrieve item image with ID of {p_iImageID}" });
ItemImage l_oItemImage = await _Context.ItemImages.FirstOrDefaultAsync(l_oImage => l_oImage.ID == p_iImageID);
if (l_oItemImage.IsNull())
return Json(new { Status = "Error", Message = $"Unable to retrieve item image with ID of {p_iImageID}" });
List<ItemImage> l_oItemImages = await _Context.ItemImages.Where(l_oImage => l_oImage.ItemID == l_oItemImage.ItemID)
.OrderBy(l_oImage => l_oImage.Order)
.ToListAsync();
l_oItemImages.Remove(l_oItemImage);
l_oItemImages.Insert(p_iNewOrderIndex, l_oItemImage);
foreach(ItemImage l_oImage in l_oItemImages)
{
l_oImage.Order = l_oItemImages.IndexOf(l_oImage);
if (l_oItemImages.IndexOf(l_oImage) == 0)
l_oImage.IsPrimary = true;
else
l_oImage.IsPrimary = false;
l_oImage.Uri = _AzureBlobStorage.GetBlobUri(_ItemImageAzureBlobContainerName, l_oImage.GetFileName());
}
_Context.ItemImages.UpdateRange(l_oItemImages);
await _Context.SaveChangesAsync();
return Json(l_oItemImages)
}
在调用UpdateRange() 和随后的SaveChangesAsync() 时l_oItemImages 的顺序和数据对我来说似乎是正确的。
我一直在查看this question,其中提到不创建新类并使用UpdateRange()。这似乎有点不同,但我可以看出这可能是我的问题。
我遇到这个问题是因为我使用Remove(l_oItemImage) 然后Insert(p_iNewOrderIndex, l_oItemImage) 操作列表的对象吗?还是因为我在抓取商品图片时使用的是ToListAsync()?
编辑:尝试用Update(l_oItemImage) 代替UpdateRange(l_oItemImages),结果相同。添加了 QuickWatch 的图像,显示了被标记的实体都正确显示了 State = Modified 以及 int Order 和 bool IsPrimary 属性的预期更改值。
编辑 2:添加了 QuickWatch 数据的图像,其中突出显示了实体上的更改属性。
【问题讨论】:
-
你能给我们更多的背景信息吗?首先是您看到的确切错误,然后是类定义和对象关系映射(relationships ecc)。如果没有这些,我会告诉你打电话给
DetectChanges(只是为了确定)和DbContext.ChangeTracker.Entries()来检查所涉及的条目。你真的需要打电话给UpdateRange吗?我的意思是,您是否已从DbContext配置中禁用跟踪? -
@MarcoLuzzara 我没有收到任何错误。数据库只是简单地不更新更改的实体。尝试更改为
foreach并使用Update(l_oItemImage)而不是使用UpdateRange(l_oItemImages),结果相同。我附上了一张显示DbContext.ChangeTracker.Entries()的结果的图像,它显示了两个图像对象的正确修改数据(如果需要,我可以截取完整数据,但这是我所期望的)。我没有在DbContext中明确禁用跟踪,其他功能似乎可以正确更新 ItemImages 上下文,所以我不知道发生了什么。