La operación no puede completarse porque el DbContext se ha eliminado utilizando MVC 4

Sé que esta pregunta se hace muchas veces. He leído e implementado todas las soluciones, pero no tuve éxito. Estoy obteniendo este error cuando recupero datos de la base de datos usando EF y me uno con el modelo luego de eso uso este modelo en la Vista.

Mi código de controlador es

using System.Linq; using System.Web.Mvc; using JsonRenderingMvcApplication.Models; namespace JsonRenderingMvcApplication.Controllers { public class PublisherController : Controller { public ActionResult Index() { PublisherModel model = new PublisherModel(); using (DAL.DevelopmentEntities context = new DAL.DevelopmentEntities()) { model.PublisherList = context.Publishers.Select(x => new SelectListItem() { Text = x.Name, Value = x.Id.ToString() }); ; } return View(model); } } } 

Mi código de vista es

 @model JsonRenderingMvcApplication.Models.PublisherModel @{ ViewBag.Title = "Index"; } 
@Html.DisplayFor(model=>model.Id) @Html.DropDownListFor(model => model.Id, Model.PublisherList);

Mi código de modelo es

 using System.Collections.Generic; using System.Web.Mvc; using System.ComponentModel.DataAnnotations; namespace JsonRenderingMvcApplication.Models { public class PublisherModel { public PublisherModel() { PublisherList = new List(); } [Display(Name="Publisher")] public int Id { get; set; } public IEnumerable PublisherList { get; set; } } } 

Mi código de entidad es

 namespace JsonRenderingMvcApplication.DAL { using System; using System.Collections.Generic; public partial class Publisher { public Publisher() { this.BOOKs = new HashSet(); } public int Id { get; set; } public string Name { get; set; } public string Year { get; set; } public virtual ICollection BOOKs { get; set; } } } 

Sí, esta entidad tiene una propiedad de navegación, pero no quiero los datos de esa entidad, así que no quiero incluirlos.

Gracias

El problema que está experimentando se debe a la ejecución diferida de LINQ. Es bastante complicado para los desarrolladores que aún no se han dado cuenta de cómo LINQ funciona bajo el capó. Tengo una gran publicación en el blog al respecto, pero el concepto central es que debe forzar una enumeración en la colección para hacer que el código LINQ se ejecute inmediatamente en lugar de hacerlo más tarde. Esto significa cambiar esto:

 model.PublisherList = context.Publishers.Select(x => new SelectListItem() { Text = x.Name, Value = x.Id.ToString() }); 

a esto:

 model.PublisherList = context.Publishers.Select(x => new SelectListItem() { Text = x.Name, Value = x.Id.ToString() }).ToList(); 

Tenga en cuenta el .ToList() allí que fuerza la enumeración.

Su consulta LINQ es diferida, lo que significa que no se está ejecutando en su controlador, sino que más adelante, probablemente en su vista, se recorre la colección (lo que obliga a la enumeración y, por lo tanto, ejecuta el LINQ). Debido a que está utilizando la instrucción using para deshacerse de su contexto DB (que, por supuesto, es una buena práctica), el contexto se descarta antes de llegar a la vista, que ejecuta el código en el contexto eliminado. Forzar la enumeración dentro de la instrucción using ejecutará el código en ese momento, en lugar de hacerlo más adelante cuando se elimine el contexto, y evitará este problema.