Maison >développement back-end >C++ >Pourquoi les propriétés de navigation principales d'EF sont-elles nulles jusqu'à l'accès direct aux entités associées ?

Pourquoi les propriétés de navigation principales d'EF sont-elles nulles jusqu'à l'accès direct aux entités associées ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-24 22:16:10614parcourir

Why Are EF Core Navigation Properties Null Until Direct Access to Related Entities?

EF Core Delay Charging Charging Navigation Attributs

Question:

Dans le modèle de noyau de framework Entity Framework (EF Core), l'attribut de navigation est retourné à la valeur vide avant d'accéder directement aux entités concernées.

Modèle:

Question de requête:

<code class="language-csharp">public class Mutant
{
    ...
    public virtual OriginalCode OriginalCode { get; set; }
}

public class OriginalCode
{
    ...
    public virtual ICollection<Mutant> Mutants { get; set; }
}</code>
Lors de la récupération du mutant, l'attribut de navigation OriginalCode est vide:

Remplissage dynamique de la relation:

mais lors de l'interrogation en entités de code original liées:
<code class="language-csharp">var mutants = db.Mutants.ToList();
mutants.ForEach(m => Console.WriteLine(m.OriginalCode == null));
// 输出:所有突变体均为True</code>

OriginalCode Navigation Les attributs des mutants se rempliront automatiquement:

Explication:

<code class="language-csharp">var originalCodes = db.OriginalCodes.ToList();</code>

Le mécanisme de pré-chargement d'EF Core remplira automatiquement les attributs de navigation des entités pertinentes qui ont été chargées dans le contexte. Dans le deuxième cas, lors de la recherche de codes originaux, le mutant correspondant sera également chargé dans le contexte, de sorte que leurs attributs de navigation seront remplis.

<code class="language-csharp">mutants.ForEach(m => Console.WriteLine(m.OriginalCode == null));
// 输出:所有突变体均为False</code>
Solution:

Pour contrôler ce comportement, la méthode de chargement explicite doit être utilisée, comme la pré-charge:

ou, pour éviter le remplissage automatique, utilisez une nouvelle instance DBContext ou pas de requête de suivi.

Mise à jour:

Dans EF Core V2.1, il prend désormais en charge le chargement de retard. Pour l'activer, marquez les attributs de navigation en tant que virtuel, installez Microsoft.entityFrameworkCore.proxies et appelez useElazyloadingProxies.

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