在我的控制器中,如何执行 foreach 表 PageContent 并仅更新每个记录内的字段记录[关闭]

问题描述 投票:0回答:1

我想更新我的控制器中的表 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());

谢谢您的建议

asp.net-core-mvc
1个回答
1
投票

根据您的评论,您可以尝试以下代码片段:

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()

这就是您收到此错误的原因。

© www.soinside.com 2019 - 2024. All rights reserved.