entity-framework-core

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?