C# InvalidOperationException:操作已在进行中

C# InvalidOperationException:操作已在进行中,c#,asp.net,entity-framework,razorengine,C#,Asp.net,Entity Framework,Razorengine,我使用的是Asp.net核心Razor引擎实体框架。我不断得到上面的错误,从我读到的内容来看,它指的是已经用于操作的数据库。我不知道为什么会发生这种情况。是因为它在foreach循环中?解决办法是什么?这是我的密码 [HttpGet] [Route("currentSession")] public IActionResult CurrentSession() { var id = HttpContext.Session.GetInt32("Id"); if(id != nul

我使用的是Asp.net核心Razor引擎实体框架。我不断得到上面的错误,从我读到的内容来看,它指的是已经用于操作的数据库。我不知道为什么会发生这种情况。是因为它在foreach循环中?解决办法是什么?这是我的密码

[HttpGet]
[Route("currentSession")]
public IActionResult CurrentSession()
{

    var id = HttpContext.Session.GetInt32("Id");
    if(id != null)
    {
        var user = _context.User.FirstOrDefault(x => x.Id == id);
         ViewBag.User = user;
         ViewBag.User_Id = id;
         ViewBag.Auction = _context.Auction.AsEnumerable();
         foreach(var item in ViewBag.Auction)
         {
             if(item.End_Date < DateTime.Now)
             {
                 var seller_id = (int)item.Id_Of_Seller;
                 var seller = _context.User.FirstOrDefault(x => x.Id == seller_id); //this is the line that causes the error in the title
                 var bidder_id = (int)item.Id_Highest_Bid;
                 var buyer = _context.User.FirstOrDefault(x => x.Id == bidder_id); //this line also causes the same error
                 buyer.Wallet -= item.Bid;
                 seller.Wallet += item.Bid;

                _context.Auction.Remove(item);
                _context.SaveChanges();
             }
         }
         return View("Home");
    } 
    return RedirectToAction("LoginPage");
}
[HttpGet]
[路由(“当前会话”)]
公共IActionResult CurrentSession()
{
var id=HttpContext.Session.GetInt32(“id”);
如果(id!=null)
{
var user=\u context.user.FirstOrDefault(x=>x.Id==Id);
ViewBag.User=用户;
ViewBag.User_Id=Id;
ViewBag.Auction=_context.Auction.AsEnumerable();
foreach(ViewBag.Auction中的var项目)
{
如果(item.End_Datex.Id==seller\u Id);//这是导致标题中出现错误的行
var投标人id=(int)item.id\u最高出价;
var buyer=\u context.User.FirstOrDefault(x=>x.Id==bidder\u Id);//此行也会导致相同的错误
买家.钱包-=物品.出价;
卖家.钱包+=物品.出价;
_上下文。拍卖。移除(项目);
_SaveChanges();
}
}
返回视图(“主页”);
} 
返回重定向到操作(“登录页面”);
}

你能试着用ToList替换AsEnumerable吗

         ViewBag.Auction = _context.Auction.ToList();

你能试着用ToList替换AsEnumerable吗

         ViewBag.Auction = _context.Auction.ToList();

我在sql server连接字符串中添加了
MultipleActiveResultSets=True
,这修复了异常。不需要进行其他更改


这为我修复了异步方法、后台任务和IQueryable循环。

我在sql server连接字符串中添加了
MultipleActiveResultSets=True
,并修复了异常。不需要进行其他更改


这为我修复了异步方法、后台任务和IQueryable循环。

因为enumerables不会加载内存中的所有数据,而是在您通过_上下文枚举时从DB中获取数据,在循环中,您再次使用_上下文删除正在枚举的同一实体上的数据。调用.ToList()首先加载拍卖数据的副本,因此_context只能对拍卖实体执行一个操作,即Remove.AsEnumerable是一个延迟操作,您在该步骤中再次对db context执行某些操作。这就是您遇到错误的原因。这不是一个好的答案,因为它只隐藏了根本问题。举个例子,如果有一百万条记录,在你可以对它们做任何事情之前将它们全部加载到内存中,该怎么办。作为一项任务,您在做什么?当此任务正在处理时,另一项任务需要在上下文中执行某些操作?在我看来,我们需要用于依赖项注入的AddDbContext不起作用,因为有许多这样的场景,其中多个后台进程都需要来自数据存储的数据。我没有这个问题的答案,因此我的搜索出现了这个错误。因为enumerables不会加载内存中的所有数据,而是在您通过_上下文枚举数据库时从数据库中获取数据,在循环中,您再次使用_上下文删除正在枚举的同一实体上的数据。调用.ToList()首先加载拍卖数据的副本,因此_context只能对拍卖实体执行一个操作,即Remove.AsEnumerable是一个延迟操作,您在该步骤中再次对db context执行某些操作。这就是您遇到错误的原因。这不是一个好的答案,因为它只隐藏了根本问题。举个例子,如果有一百万条记录,在你可以对它们做任何事情之前将它们全部加载到内存中,该怎么办。作为一项任务,您在做什么?当此任务正在处理时,另一项任务需要在上下文中执行某些操作?在我看来,我们需要用于依赖项注入的AddDbContext不起作用,因为有许多这样的场景,其中多个后台进程都需要来自数据存储的数据。我没有这个问题的答案,虽然我的搜索问题与这个错误。