2012-08-08 1 views
7

J'écris une application simple dans EF 4.1 qui utilisera ajouter, supprimer, éditer et détailler ma source de données commune (serveur central pour la base de données). Dans ma classe Controller i écrire:L'opération ne peut pas être terminée car le DbContext a été éliminé

public class RegController : Controller 
    { 
     // 
     // GET: /Reg/ 
     private string CmdStr = ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString;  
     public ActionResult Index() 
     { 
     using (var db = new RegModelContext(CmdStr)) 
     { 
      return View(db.Registrant); 
     } 

    } 
} 

quand j'exécute ma demande, il m'a donné une erreur dans la vue d'index à foreach:

@model IEnumerable<Registration.Models.Register> 

@{ 
    Layout = null; 
} 

<!DOCTYPE html> 

<html> 
<head> 
    <title>Index</title> 
</head> 
<body> 
    <p> 
     @Html.ActionLink("Create New", "Create") 
    </p> 
    <table> 
     <tr> 
      <th></th> 
      <th> 
       UserName 
      </th> 
      <th> 
       Password 
      </th> 
      <th> 
       Email 
      </th> 
      <th> 
       Address 
      </th> 
     </tr> 

    @foreach (var item in Model) { 
     <tr> 
      <td> 
       @Html.ActionLink("Edit", "Edit", new { id=item.Id }) | 
       @Html.ActionLink("Details", "Details", new { id=item.Id }) | 
       @Html.ActionLink("Delete", "Delete", new { id=item.Id }) 
      </td> 
      <td> 
       @item.UserName 
      </td> 
      <td> 
       @item.Password 
      </td> 
      <td> 
       @item.Email 
      </td> 
      <td> 
       @item.Address 
      </td> 
     </tr> 
    } 

    </table> 
</body> 
</html> 

L'erreur est la suivante: « L'opération ne peut pas être complété car le DbContext a été éliminé. "

+7

Vous devez retourner db.Registrant.ToList(), car il essaie d'exécuter une requête après que datacontext est disposé, ToList() forcera à l'exécuter plus tôt. – Giedrius

Répondre

12

Vous devez utiliser une liste pour passer comme modèle

Je suppose que db.Registrant retour une liste d'utilisateurs ?, si oui quelque chose comme ça

List<Registrant> items = null; 

using (var db = new RegModelContext(CmdStr)) 
{ 
    items = db.Registrant.ToList(); 
} 

return View(items); 
+0

Cette fois il a donné une erreur sur items = db.Registrant.ToList(); Cela " " Une erreur s'est produite lors de l'exécution de la définition de la commande. Voir l'exception interne pour plus de détails. " –

+0

J'ai changé le code, avez-vous essayé de cette façon? – JohnnBlade

+3

Pourquoi' de u ... sélectionnez vous et pas seulement 'db.Registrant.ToList()' – sloth

6

Juste pour commenter plus loin, vous besoin de séparer vos préoccupations. Vous ne devriez pas utiliser le contexte de base de données comme ça dans un contrôleur. Utilisez-le plutôt via un référentiel ou une couche de service. J'ai également eu ce problème lors de l'utilisation using. J'ai enlevé la partie utilisatrice. Modifiez le code ci-dessous pour l'adapter à votre scénario. En supposant que vous devez ramener une liste d'utilisateurs. Je ceci dans ma classe référentiel:

public class UserRepository : IUserRepository 
{ 
    MyDbContext dbContext = new MyDbContext(); 

    public IEnumerable<User> GetAll() 
    { 
      return dbContext.Users; 
    } 
} 

Ce référentiel vous avez ensuite injecté dans votre contrôleur par Autofac, Ninject, etc.

Dans votre contrôleur, il ressemblerait à quelque chose comme ceci:

public class UserController : Controller 
{ 
    private readonly IUserRepository userRepository; 

    public UserController(IUserRepository userRepository) 
    { 
      this.userRepository = userRepository; 
    } 

    public ActionResult Index() 
    { 
      UserViewModel viewModel = new UserViewModel 
      { 
       Users = userRepository.GetAll() 
      }; 
    } 
} 

Et puis dans votre vue, vous pouvez simplement parcourir les utilisateurs.

+4

Probablement parce qu'elle était superflue à la question elle-même, elle ne devrait probablement pas être rejetée, mais en même temps elle n'aurait pas dû être votée pour la même raison. doit adhérer à SoC, surtout si c'est super simple –

Questions connexes