首页 > 解决方案 > EFCore/C# - 集合已修改 -> 操作可能无法执行

问题描述

我有以下循环。一旦第一次迭代成功,我就会收到以下错误: 在此处输入图像描述

for循环内没有任何地方我正在更改weeklyReportsListor weeklyReport1.DailyReports,所以我不明白错误来自哪里,我似乎无法找到可以修改 Collection 的位置

代码

foreach (var weeklyReport1 in weeklyReportsList)
            {
                foreach(var dailyReport in weeklyReport1.DailyReports)
                {
                    _context.Attach(dailyReport);

                    User user = GetDataUser(Convert.ToInt32(User.FindFirst(ClaimTypes.PrimarySid).Value));

                    if (user == null)
                    {
                        _toastNotification.AddErrorToastMessage("Utilizador não encontrado.");
                        OnGet();
                        return Page();
                    }
                    else
                    {
                        dailyReport.UserCreator = user;
                    }

                    /*dailyReport.States = GetDataStates(state);
                    _context.Entry(dailyReport).Reference(dr => dr.States).IsModified = true;*/

                    dailyReport.EstimatedDate = nextDate;
                    _context.Entry(dailyReport).Property(dr => dr.EstimatedDate).IsModified = true;

                    dailyReport.WeeklyReportId = nextWeeklyReport.Id;
                    dailyReport.WeekDay = GetWeekDayName((DateTime)dailyReport.EstimatedDate);

                    try
                    {
                        await _context.SaveChangesAsync();
                    }
                    catch (DbUpdateException e)
                    {
                        _toastNotification.AddErrorToastMessage("Falha ao editar Registo");
                        Console.Write(e);
                        return RedirectToPage("Index");
                    }

                    _context.Entry(dailyReport).State = EntityState.Detached;
                    await CreateLog(dailyReport.Id);
                }
            }

public async Task<IActionResult> CreateLog(int id)
        {
            DailyReport editedDailyReport = GetDailyReport(id);
            User user = GetDataUser(Convert.ToInt32(User.FindFirst(ClaimTypes.PrimarySid).Value));
            LogReports logReports = new LogReports(editedDailyReport, "Edição Registo Atrasado", user.Id);
            _context.LogReportsReception.Add(logReports);

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateException e)
            {
                Console.Write(e);
                _toastNotification.AddWarningToastMessage("Log Registo não criado");
            }
            return null;
        }

PS:所有其他功能(Get...())仅与数据检索相关。那里没有任何归属

标签: c#entity-framework-core

解决方案


您使用 foreach 迭代的集合在迭代期间可能不会被修改。因此,您不能以这种方式修改元素。但是,您可以循环浏览该集合的副本。例如循环实例化时的 Collection.ToList()。这将允许您在循环中修改您的实际集合,同时不更改集合的“副本”。您可以通过更改来验证这一点:

foreach(var dailyReport in weeklyReport1.DailyReports)

foreach(var dailyReport in weeklyReport1.DailyReports.ToList())

推荐阅读