Maison >développement back-end >C++ >Pourquoi les relations principales EF sont-elles nulles jusqu'à ce qu'elles soient explicitement chargées ?

Pourquoi les relations principales EF sont-elles nulles jusqu'à ce qu'elles soient explicitement chargées ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-24 22:19:08562parcourir

Why are EF Core Relationships Null Until Explicitly Loaded?

EF Le chargement de retard de base provoque l'attribut de la relation à vide

Question:

Lors de l'obtention d'entités contenant des données associées, EF Core sera initialement renvoyé aux relations vides avant d'exécuter un chargement explicite.

Scène:

Considérez la classe physique suivante:

La relation est configurée dans la méthode :

<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>
Question:

OnModelCreating

Initialement, les attributs
<code class="language-csharp">modelBuilder.Entity<Mutant>()
    .HasOne(m => m.OriginalCode)
    .WithMany(oc => oc.Mutants)
    .HasForeignKey(m => m.OriginalCodeId);</code>
des entités mutantes retarables étaient nuls. Cependant, l'accès à la collection

dans une requête séparée remplira l'attribut .

Explication:

OriginalCode OriginalCodes EF Core ne prend pas en charge le chargement de retard par défaut. Les relations ne seront pas chargées avec impatience à moins que la demande claire. Dans la première scène, parce que la relation n'est pas explicitement incluse dans la requête, elle reste nul. OriginalCode

Solution:

Il existe deux façons de résoudre ce comportement:

<.> 1. Chargement avide: OriginalCode

Utiliser Dans la requête, il contient des données pertinentes:

<.> 2. Utilisez le chargement de retard:

À partir de EF Core 2.1, il prend en charge le chargement de retard. Cependant, cela nécessite activer et utilise des attributs de navigation virtuelle.

Empêcher le remplissage automatique:

Include()

Si vous n'avez pas besoin de remplir la relation, vous pouvez l'arrêter en utilisant une nouvelle instance DBContext ou en utilisant
<code class="language-csharp">var mutants = db.Mutants.Include(m => m.OriginalCode).ToList();</code>
sans suivre les demandes pour chaque requête.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn