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
Libérer: 2025-01-24 22:19:08
original
516 Les gens l'ont consulté

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>
Copier après la connexion
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>
Copier après la connexion
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>
Copier après la connexion
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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal