Я использую платформу Entity Framework для ядра Razor. Я продолжаю получать ошибку выше, и это из того, что я прочитал, это относится к db, уже используемому для операции. Я не знаю, почему это произойдет. Это потому, что он находится в цикле foreach? Каким будет обходной путь? Вот мой кодInvalidOperationException: операция уже выполняется
[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");
}
Спасибо, почему это сработало? – Aaron
Поскольку перечисления не загружают все данные в память, а извлекают данные из БД при перечислении через них через _context и внутри цикла, в котором вы снова использовали _context для удаления данных на том же объекте, который перечисляется. Вызов .ToList() загружает копию данных аукциона на первом месте, поэтому _context имеет только одну операцию для выполнения на аукционе, то есть Remove. – vendettamit
AsEnumerable - это отложенное действие, и вы снова выполняете что-то в контексте db на этом шаге. Именно по этой причине вы столкнулись с этой ошибкой. – Teja