update tutorial net mvc framework first espaƱol code asp c# asp.net-mvc linq entity-framework dbcontext

c# - tutorial - mvc entity framework relationships



La operaciĆ³n no se puede completar porque el DbContext se ha eliminado utilizando MVC 4 (1)

El problema que estás experimentando se debe a la ejecución diferida de LINQ. Es todo lo que necesitan los desarrolladores que aún no se han dado cuenta de cómo funciona LINQ bajo el capó. Tengo una excelente publicación en el blog al respecto, pero el concepto principal es que debe forzar una enumeración en la colección para 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() que obliga a la enumeración.

Su consulta LINQ se difiere, lo que significa que no se está ejecutando en su controlador, sino en su lugar después, probablemente en su vista en la que realiza un bucle en la colección (lo que fuerza la enumeración y, por lo tanto, ejecuta el LINQ). Debido a que está utilizando la declaración de using para eliminar el contexto de su base de datos (que por supuesto es una buena práctica), el contexto se elimina antes de llegar a la vista, que ejecuta el código contra el contexto eliminado. Forzar la enumeración dentro de la declaración de using ejecutará el código en ese momento, en lugar de hacerlo más tarde cuando se elimine el contexto, y evitará este problema.

Sé que esta pregunta se hace tantas veces. He leído e implementado todas las soluciones pero no tuve éxito. Recibo este error cuando recupero datos de la base de datos utilizando EF y los vinculo con el modelo después de que use 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"; } <div> @Html.DisplayFor(model=>model.Id) @Html.DropDownListFor(model => model.Id, Model.PublisherList); </div> <div id="booksDiv"> </div>

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<SelectListItem>(); } [Display(Name="Publisher")] public int Id { get; set; } public IEnumerable<SelectListItem> 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<BOOK>(); } public int Id { get; set; } public string Name { get; set; } public string Year { get; set; } public virtual ICollection<BOOK> BOOKs { get; set; } } }

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

Gracias