2012-08-08 14 views
7

Sto scrivendo una semplice applicazione in EF 4.1 che userà aggiungere, eliminare, modificare e dettagliare la mia fonte di dati comune (server centrale per database). Nella mia classe Controller scrivo:L'operazione non può essere completata perché DbContext è stato smaltito

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

    } 
} 

quando sto eseguendo la mia domanda mi ha dato un errore nella visualizzazione indice in un'istruzione 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'errore è questo: "L'operazione non può essere completato perché DbContext è stato eliminato. "

+7

È necessario restituire db.Registrant.ToList(), poiché tenta di eseguire una query dopo la disposizione di datacontext, ToList() imporrà di eseguirlo prima. – Giedrius

risposta

12

È necessario utilizzare un elenco per passare come modello

Suppongo che db.Registrant restituire un elenco di utenti ?, in caso affermativo fare qualcosa di simile

List<Registrant> items = null; 

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

return View(items); 
+0

Questa volta ha dato un errore su items = db.Registrant.ToList(); " " Si è verificato un errore durante l'esecuzione della definizione del comando. Vedi l'eccezione interna per i dettagli. " –

+0

Ho cambiato il codice, hai provato in questo modo ?? – JohnnBlade

+3

Perché' da u ... selezionare u' e non solo 'db.Registrant.ToList()' – sloth

6

Giusto per commentare ulteriormente, è bisogno di separare le vostre preoccupazioni. Non si dovrebbe usare il contesto del database come quello in un controller. Piuttosto, utilizzalo attraverso un repository o un livello di servizio.

Ho riscontrato questo problema anche quando si utilizza using. Ho rimosso la parte usando. Modifica il codice qui sotto per adattarlo al tuo scenario. Supponendo che tu debba riportare un elenco di utenti. Avrei questo nella mia classe repository:

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

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

Questo repository poi stata iniettata nel controller per Autofac, Ninject, ecc

Nel vostro controller sarebbe simile a questa:

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() 
      }; 
    } 
} 

E poi nella tua vista puoi semplicemente passare in rassegna gli utenti.

+4

Probabilmente perché era superfluo alla domanda vera e propria, probabilmente non dovrebbe essere davvero sottovalutato, ma allo stesso tempo non avrebbe dovuto essere votato per lo stesso motivo. deve aderire a SoC, specialmente se è semplicissimo –

Problemi correlati