我想更新我的控制器中的表 PageContent 的所有记录。 如何执行 foreach 或 for 来更新我表的所有记录,但我只想更新两个字段:
fetched.PageContentVisible = false;
fetched.PageContentPhoto = "Submenu" + "-" + item.PageContentId + "-" + item.MenuSubId + "-" + item.PageSectionId;
这是代码:
// GET: PageContents/UpdateScript
public async Task<IActionResult> UpdateScript()
{
using (var transaction = new TransactionScope())
{
var pageContent = _context.PageContent.Include(p => p.ParentMenuPage).Include(p => p.ParentPageSection);
using (_context)
{
foreach (var item in pageContent)
{
var fetched = _context.PageContent.Find(item.PageContentId);
fetched.PageContentPhoto = "PageContent" + "-" + item.PageContentId + "-" + item.MenuSubId + "-" + item.PageSectionId;
if (item.PageSectionId == 2)
{
fetched.PageContentVisible = false;
}
_context.Entry(fetched).State = EntityState.Modified;
//await _context.SaveChangesAsync();
_context.SaveChanges();
}
}
transaction.Complete();
return View(await pageContent.ToListAsync());
}
}
但是由于这个错误它不起作用:
ObjectDisposeException:无法访问已释放的上下文实例。导致此错误的一个常见原因是处置从依赖项注入解析的上下文实例,然后尝试在应用程序的其他位置使用相同的上下文实例。如果您在上下文实例上调用“Dispose”或将其包装在 using 语句中,则可能会发生这种情况。如果您使用依赖项注入,则应该让依赖项注入容器负责处理上下文实例。 对象名称:“ApplicationDbContext”。 Microsoft.EntityFrameworkCore.DbContext.CheckDispose()
PageContentsController.cs 中的 CateringMilano.Controllers.PageContentsController.UpdateScript() + 返回视图(等待 pageContent.ToListAsync());
谢谢您的建议
根据您的评论,您可以尝试以下代码片段:
public async Task<IActionResult> UpdateScript()
{
using (var transaction = new TransactionScope())
{
var pageContent = _context.PageContent.Include(p => p.ParentMenuPage).Include(p => p.ParentPageSection);
using (_context)
{
foreach (var item in pageContent)
{
var fetched = _context.PageContent.Find(item.PageContentId);
fetched.PageContentPhoto = "PageContent" + "-" + item.PageContentId + "-" + item.MenuSubId + "-" + item.PageSectionId;
if (item.PageSectionId == 2)
{
fetched.PageContentVisible = false;
}
_context.Entry(fetched).State = EntityState.Modified;
//await _context.SaveChangesAsync();
_context.SaveChanges();
}
}
transaction.Complete(); // Here already your transaction completed,so this line will not work await pageContent.ToListAsync()
return RedirectToAction("GetUpdatedPageContent"); // Redirect to new View and there you can read the new data and return the view like below
}
}
在新视图上读取新更新的数据并将该值返回到视图。这将解决你的问题。请参阅下面的示例:
public async Task<IActionResult> UpdateScript()
{
var pageContent = _context.PageContent.Include(p => p.ParentMenuPage).Include(p => p.ParentPageSection);
return View(pageContent); // Redirect this view finally
}
由于您已完成此处的
scope
transaction.Complete()
,因此此后您将无法执行任何操作,因为此范围的数据库连接已关闭。所以您无法再访问此await pageContent.ToListAsync()
。
这就是您收到此错误的原因。