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;
}
}
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.