2017-02-03 5 views
0

Я использую платформу 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"); 
} 

ответ

1

Можете ли вы попробовать заменить AsEnumerable на ToList?

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

Спасибо, почему это сработало? – Aaron

+0

Поскольку перечисления не загружают все данные в память, а извлекают данные из БД при перечислении через них через _context и внутри цикла, в котором вы снова использовали _context для удаления данных на том же объекте, который перечисляется. Вызов .ToList() загружает копию данных аукциона на первом месте, поэтому _context имеет только одну операцию для выполнения на аукционе, то есть Remove. – vendettamit

+0

AsEnumerable - это отложенное действие, и вы снова выполняете что-то в контексте db на этом шаге. Именно по этой причине вы столкнулись с этой ошибкой. – Teja

0

MultipleActiveResultSets=True Я добавил к моей строке подключения SQL-сервера, и это исправило исключение. Никаких других изменений не требовалось.

Это фиксировало методы асинхронизации, фоновые задачи и циклы IQueryable для меня.

Смежные вопросы