ventajas tutorial relaciones mvc framework first español desventajas code entity-framework ef-code-first entity-framework-5 lazy-loading entity-framework-6

entity-framework - tutorial - mvc entity framework español



En Entity Framework, ¿por qué la carga diferida no funciona para una propiedad de navegación de uno a cero o uno? (4)

Hay algunas reglas para habilitar o tener carga perezosa:

context.Configuration.ProxyCreationEnabled should be true. context.Configuration.LazyLoadingEnabled should be true.

La propiedad de navegación debe definirse como pública, virtual.

El contexto no hará una carga lenta si la propiedad no está definida como virtual.

Ejemplo

public class ApplicationDbContext : DbContext { public ApplicationDbContext() : base("ProjectConnection") { Configuration.LazyLoadingEnabled = true; Configuration.ProxyCreationEnabled = true; } }

Lee mas

Considerar las clases de Person y Address definidas como

class Person { public int PersonId { get; set; } public virtual Address Address { get; set; } } class Address { public int PersonId { get; set; } public virtual Person Person { get; set; } }

donde solo algunas personas tienen una dirección, pero todas las direcciones tienen una persona. Esta es una relación de uno a cero o uno , así que la configuro como

modelBuilder.Entity<Address>() .HasKey(a => a.PersonId) .HasRequired(a => a.Person) .WithOptional(a => a.Address);

Ahora, en mi código, el siguiente enfoque (carga impaciente) funciona perfectamente bien.

var person = context.Person .Include(a => a.Address) .Single(a => a.PersonId == 123); var address = person.Address; // address != null (correct)

Sin embargo, el siguiente enfoque (carga perezosa) no lo hace.

var person = context.Person .Single(a => a.PersonId == 123); var address = person.Address; // address == null (incorrect)

Además, conecté el Analizador de SQL y puedo ver que EF ni siquiera intenta cargar de forma perezosa la Dirección en el segundo caso, solo devuelve nulo.

No he podido localizar ninguna documentación que indique que EF no carga de forma perezosa las propiedades de navegación de uno a cero o uno. ¿Es esto por diseño, es un error, o estoy haciendo algo mal?

Probé esto con Entity Framework 5 y Entity Framework 6 Alpha 3 y obtuve los mismos resultados.


Me di cuenta de esto. Las clases de entidad deben declararse como public y las propiedades public virtual para que la carga diferida funcione. Es decir

public class Person { public int PersonId { get; set; } public virtual Address Address { get; set; } } public class Address { public int PersonId { get; set; } public virtual Person Person { get; set; } }


Otro punto que también puede ser la razón a veces, es si uno se olvida de agregar el modificador virtual a la propiedad de navegación


Si está utilizando el enfoque de la Base de datos por primera vez, asegúrese de que la propiedad Lazy Loading Enabled sea True Puede encontrar esta propiedad en las propiedades del diagrama EDMX.

También puede anular el comportamiento configurando dbcontext.Configuration.LazyLoadingEnabled = true donde dbcontext es la instancia de DbContext.