2012-08-08 22 views
7

Estoy escribiendo una aplicación simple en EF 4.1 que usará agregar, eliminar, editar y detallar mi fuente de datos común (servidor central para la base de datos). En mi clase controlador que escribo:La operación no se puede completar porque se ha eliminado el DbContext

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

    } 
} 

cuando estoy cumpliendo mi solicitud me dio un error en la vista del índice de instrucción 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> 

El error es la siguiente: "La operación no puede se complete porque el DbContext ha sido eliminado ".

+7

Debe devolver db.Registrant.ToList(), porque intenta ejecutar la consulta después de que se elimine el contexto de datos, ToList() obligará a ejecutarlo antes. – Giedrius

Respuesta

12

Se debe utilizar una lista para pasar como su modelo

Asumo que db.Registrant devolver una lista de usuarios ?, si es así hacer algo como esto

List<Registrant> items = null; 

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

return View(items); 
+0

Esta vez dio un error en items = db.Registrant.ToList(); Que " " Ocurrió un error al ejecutar la definición del comando. Vea la excepción interna para más detalles. " –

+0

Cambié el código, ¿lo intentó de esta manera? – JohnnBlade

+3

¿Por qué' de usted ... seleccione u' y no solo 'db.Registrant.ToList()' – sloth

6

Sólo hacer más comentarios, se necesita separar tus preocupaciones No debe usar el contexto de la base de datos así en un controlador. Más bien úsela a través de un repositorio o capa de servicio.

También tuve este problema al usar using. Eliminé la parte que usaba. Modifique el código a continuación para que se ajuste a su escenario. Suponiendo que debe traer de vuelta una lista de usuarios. Tendría esto en mi clase de repositorio:

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

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

Este repositorio, a continuación, se ha inyectado en su controlador por Autofac, Ninject, etc.

En su controlador se vería algo como esto:

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

Y a continuación, en su vista puede simplemente recorrer los usuarios.

+4

Probablemente porque era superflua a la pregunta real. Probablemente no debería haber sido votado negativamente, pero al mismo tiempo no debería haber sido votado por la misma razón. No todos los proyectos que uno hace necesita adherirse a SoC, especialmente si es súper simple –

Cuestiones relacionadas