Home >Backend Development >C++ >Why are EF Core Relationships Null Until Explicitly Loaded?
EF Core lazy loading causes the relationship attribute to be empty
Question:
When retrieving an entity that contains related data, EF Core will initially return an empty relationship before performing an explicit load.
Scene:
Consider the following entity class:
<code class="language-csharp">public class Mutant { public long Id { get; set; } public long OriginalCodeId { get; set; } public virtual OriginalCode OriginalCode { get; set; } } public class OriginalCode { public long Id { get; set; } public virtual List<Mutant> Mutants { get; set; } }</code>The
relationship is configured in the OnModelCreating
method:
<code class="language-csharp">modelBuilder.Entity<Mutant>() .HasOne(m => m.OriginalCode) .WithMany(oc => oc.Mutants) .HasForeignKey(m => m.OriginalCodeId);</code>
Question:
Initially, the OriginalCode
property of the Mutant entity retrieved via the query is null. However, accessing the OriginalCodes
collection in a separate query populates the OriginalCode
attribute.
Explanation:
EF Core does not support lazy loading by default. Relations will not be loaded eagerly unless explicitly requested. In the first scenario, since the OriginalCode
relation is not explicitly included in the query, it remains null.
Solution:
There are two ways to resolve this behavior:
1. Eager loading:
Use Include()
to explicitly include relevant data in the query:
<code class="language-csharp">var mutants = db.Mutants.Include(m => m.OriginalCode).ToList();</code>
2. Use lazy loading:
Starting with EF Core 2.1, lazy loading is supported. However, this requires enabling and using virtual navigation attributes via UseLazyLoadingProxies()
.
<code class="language-csharp">modelBuilder.UseLazyLoadingProxies(); public class Mutant { public long Id { get; set; } public long OriginalCodeId { get; set; } public virtual OriginalCode OriginalCode { get; set; } }</code>
Block autofill:
If you don't need autopopulation of relationships, you can prevent it by using a new DbContext instance for each query or using AsNoTracking()
for traceless queries.
The above is the detailed content of Why are EF Core Relationships Null Until Explicitly Loaded?. For more information, please follow other related articles on the PHP Chinese website!