2017-02-03 3 views
0

J'utilise Asp.net core Razor engine Entity Framework. Je continue à obtenir l'erreur ci-dessus et à partir de ce que j'ai lu, il se réfère à la db déjà utilisée pour une opération. Je ne suis pas sûr de savoir pourquoi cela se produirait. Est-ce parce que c'est dans une boucle foreach? Quelle serait la solution de contournement? Voici mon codeInvalidOperationException: Une opération est déjà en cours

[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"); 
} 

Répondre

1

Pouvez-vous essayer de remplacer AsEnumerable par ToList?

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

Merci, pourquoi cela a-t-il fonctionné? – Aaron

+0

Étant donné qu'énumérables ne charge pas toutes les données en mémoire mais récupère les données de la base de données en les énumérant via _context et dans la boucle, vous réutilisez _context pour supprimer les données de la même entité en cours d'énumération. L'appel de .LoList() charge la copie des données de l'enchère en premier lieu et ainsi _context n'a qu'une seule opération à effectuer sur l'entité Auction, c'est-à-dire Remove. – vendettamit

+0

AsEnumerable est une action différée et vous effectuez à nouveau quelque chose sur le contexte db à cette étape. C'est la raison pour laquelle vous avez rencontré cette erreur. – Teja

0

j'ajouté MultipleActiveResultSets=True à mes chaînes de connexion du serveur SQL et ce fixe l'exception. Aucun autre changement n'était nécessaire.

Cela a corrigé les méthodes asynchrones, les tâches d'arrière-plan et les boucles IQueryable pour moi.