tutorial net mvc framework first español code asp c# asp.net-mvc entity-framework entity-framework-6

c# - net - entity framework tutorial español



Las propiedades de navegación no se cargan correctamente (1)

Mi contexto se ve así:

public class ApplicationDbContext: IdentityDbContext<ApplicationUser> { public ApplicationDbContext() : base("DefaultConnection") { this.Configuration.LazyLoadingEnabled = true; } //DbSet properties }

por lo tanto, la carga diferida está habilitada.

Tengo la siguiente clase:

public class Home { private ICollection<Slide> _slides; [Key] [Required] public string Name { get; set; } [ForeignKey("Header")] public int? HeaderID { get; set; } //Navigation properties public ICollection<Slide> Slides { get { return _slides ?? (_slides = new List<Slide>()); } set { _slides = value; } } public Content Header { get; set; } }

Tenga en cuenta que ambas propiedades de navegación, Header y Slides se utilizan sin palabra clave virtual . Por lo que sé, cuando no usamos palabras clave virtual , las propiedades se deben cargar con entusiasmo.

Sin embargo, cuando obtengo mi entidad de Home de la base de datos, mis dos propiedades de navegación son null (pero la propiedad HeaderID tiene valor).
Incluso si cambio a this.Configuration.LazyLoadingEnabled = false; - Preperties no cargadas - aún null .

Aquí es cómo obtengo mis datos de db (usando el patrón de repositorio):

public static Home GetHomeComponent( this IRepositoryAsync<Home> repository) { var result = repository .Query() .Select() .First(); return result; }

Solucioné mi problema con las propiedades Include :

public static Home GetHomeComponent( this IRepositoryAsync<Home> repository) { var result = repository .Query() .Include(x => x.Header) .Include(x=>x.Slides) .Select() .First(); return result; }

Sin embargo, no es conveniente para mí (ya que tengo demasiadas propiedades de navegación para cargar).

Entonces, mi pregunta es:
No utilizo palabra clave virtual , pero ¿por qué mis propiedades de navegación no se cargan con entusiasmo?
O estoy haciendo algo mal? ¿Hay alguna otra forma de cargar mis propiedades de navegación sin usar Include ?


Si no usa la palabra clave virtual , solo significa que una vez que intente acceder a la propiedad no virtual, no se cargará desde la base de datos, pero obtendrá un valor Null .

No significa que tendrá todas las propiedades de las entidades llenas de inmediato, para llenar las Slides de EG en su código, debe usar .Include (): esta carga está ansiosa, para cargar la propiedad usted mismo antes de usado .

Puede hacer una función genérica que completará las propiedades requeridas por los argumentos que obtiene (usando params) vea aquí para más detalles:

EntityFramework Eager Load all Navigation Properties