palabra clave virtual, método de extensión Incluir, carga diferida, carga impaciente: ¿cómo funciona realmente la carga de objetos relacionados?

Cargar objetos relacionados en MVC puede ser bastante confuso.

Hay muchos términos que debe conocer y aprender si realmente quiere saber qué está haciendo cuando escribe las clases y controladores de su modelo de entidad.

Un par de preguntas que he tenido durante mucho tiempo son: ¿Cómo funciona elvirtual palabra clave trabajo y cuando debo usarlo? Y como funcionaInclude ¿El método de extensión funciona y cuándo debo usarlo?

Esto es lo que estoy hablando;

virtual palabra clave:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace LazyLoading.Models
{
    public class Brand
    {
        public int BrandId { get; set; }
        public string Name { get; set; }
        public int ManufacturerId { get; set; }
        public virtual Manufacturer Manufacturer { get; set; }
    }
}

Y elInclude método de extensión:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using LazyLoading.Models;

namespace LazyLoading.Controllers
{
    public class LazyLoadingStoreController : Controller
    {
        private UsersContext db = new UsersContext();

        //
        // GET: /LazyLoadingStore/

        public ActionResult Index()
        {
            var brands = db.Brands.Include(b => b.Manufacturer);
            return View(brands.ToList());
        }

        ... Other action methods ...

Tenga en cuenta que elIndex() El método de acción es autogenerado por Visual Studio. Sí, Visual Studio agregó automáticamente el.Include(b => b.Manufacturer). Eso es bastante bonito.

Respuestas a la pregunta(3)

Su respuesta a la pregunta