entity framework core - EF Core devuelve relaciones nulas hasta acceso directo
entity-framework-core (1)
El motivo se explica en la sección Carga de datos relacionados de la documentación de EF Core.
El primer comportamiento es porque EF Core actualmente no admite la carga diferida, por lo que normalmente obtendrá valores
null
para las propiedades de navegación hasta que las cargue específicamente a través de una carga ansiosa o explícita.
Sin embargo, la sección de
carga Eager
contiene lo siguiente:
Propina
Entity Framework Core corregirá automáticamente las propiedades de navegación a cualquier otra entidad que se haya cargado previamente en la instancia de contexto. Por lo tanto, incluso si no incluye explícitamente los datos de una propiedad de navegación, la propiedad aún puede rellenarse si algunas o todas las entidades relacionadas se cargaron previamente.
lo que explica por qué la propiedad de navegación no es nula en el segundo caso.
Ahora, no estoy seguro de cuál de los dos comportamientos desea corregir, por lo que trataré de abordar ambos.
El primer comportamiento puede "arreglarse" mediante el uso de uno de los métodos disponibles actualmente para cargar datos relacionados, por ejemplo, carga ansiosa:
var mutants = db.Mutants.Include(m => m.OriginalCode).ToList();
El segundo comportamiento es "por diseño" y no se puede controlar.
Si desea evitarlo, asegúrese de usar una nueva instancia nueva de
DbContext
solo para ejecutar una sola consulta para volver a intentar los datos necesarios.
Actualización: a
partir de v2.1, EF Core admite
carga diferida
.
Sin embargo, no está habilitado de forma predeterminada, por lo que para utilizarlo uno debe marcar todas las propiedades de navegación
virtual
, instalar
Microsoft.EntityFrameworkCore.Proxies
y habilitarlo a través de la llamada
UseLazyLoadingProxies
, o utilizar
Lazy-loading sin proxies
, ambos explicados con ejemplos en EF Core documentación.
Tengo algunos modelos como los siguientes:
public class Mutant
{
public long Id { get; set; }
...
// Relations
public long OriginalCodeId { get; set; }
public virtual OriginalCode OriginalCode { get; set; }
public int DifficultyLevelId { get; set; }
public virtual DifficultyLevel DifficultyLevel { get; set; }
}
y
public class OriginalCode
{
public long Id { get; set; }
...
// Relations
public virtual List<Mutant> Mutants { get; set; }
public virtual List<OriginalCodeInputParameter> OriginalCodeInputParameters { get; set; }
}
y en
OnModelCreating
de
DBContext
hice las relaciones como estas:
modelBuilder.Entity<Mutant>()
.HasOne(m => m.OriginalCode)
.WithMany(oc => oc.Mutants)
.HasForeignKey(m => m.OriginalCodeId)
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);
modelBuilder.Entity<Mutant>()
.HasOne(m => m.DifficultyLevel)
.WithMany(dl => dl.Mutants)
.HasForeignKey(m => m.DifficultyLevelId)
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);
ahora cuando solicito mutantes, el código original es nulo:
pero tan pronto como solicito los códigos
OriginalCode
como a continuación:
entonces el campo
OriginalCode
de los mutantes no será nulo:
¿Cuál es el motivo y cómo podría solucionarlo?