Maison >développement back-end >C++ >Pourquoi les propriétés de navigation de base EF sont-elles nulles jusqu'à ce qu'elles soient explicitement chargées, et comment puis-je les remplir de manière cohérente?

Pourquoi les propriétés de navigation de base EF sont-elles nulles jusqu'à ce qu'elles soient explicitement chargées, et comment puis-je les remplir de manière cohérente?

Barbara Streisand
Barbara Streisandoriginal
2025-01-24 22:25:09730parcourir

Why are EF Core navigation properties null until explicitly loaded, and how can I consistently populate them?

Chargement paresseux d'EF Core du problème et de la solution de la valeur nulle des propriétés de navigation

Description du problème

Considérons le modèle suivant :

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

Définissez la relation dans la méthode OnModelCreating de DbContext :

<code class="language-csharp">modelBuilder.Entity<Mutant>()
    .HasOne(m => m.OriginalCode)
    .WithMany(oc => oc.Mutants)
    .HasForeignKey(m => m.OriginalCodeId)
    .OnDelete(DeleteBehavior.Restrict);</code>

Lors de l'interrogation d'un mutant, la propriété OriginalCode est initialement vide. Cependant, si vous interrogez OriginalCode avant d'interroger le mutant, l'attribut OriginalCode sera renseigné.

Analyse des causes

Ce comportement est documenté dans la section « Chargement des données associées » de la documentation EF Core :

Entity Framework Core ne prend actuellement pas en charge le chargement différé, donc généralement les propriétés de navigation seront vides jusqu'à ce que vous les chargiez via le préchargement ou explicitement.

Cependant, la section « Préchargement » contient les éléments suivants :

Conseils Entity Framework Core corrigera automatiquement les propriétés de navigation de toutes les autres entités précédemment chargées dans l'instance de contexte. Par conséquent, même si vous n’incluez pas explicitement les données d’une propriété de navigation, la propriété peut toujours être renseignée si tout ou partie des entités associées ont été précédemment chargées.

Solution

Résoudre le premier problème (l'attribut de navigation est vide) :

Utilisez les méthodes disponibles pour charger les données pertinentes, telles que le préchargement :

<code class="language-csharp">var mutants = db.Mutants.Include(m => m.OriginalCode).ToList();</code>

Corriger le deuxième problème (préchargement des entités associées provoquant le remplissage des propriétés de navigation) :

Ce comportement est « prévu par la conception » et ne peut pas être contrôlé. Pour éviter ce problème :

  • Utilisez une nouvelle instance DbContext pour chaque requête.
  • N'utilisez aucune requête de suivi (AsNoTracking()).

EF Core v2.1 et mises à jour ultérieures :

EF Core v2.1 prend en charge le chargement différé, mais il n'est pas activé par défaut. Pour l'activer :

  • Marquez toutes les propriétés de navigation avec virtual.
  • Installez le Microsoft.EntityFrameworkCore.Proxies package NuGet.
  • Utilisez UseLazyLoadingProxies() pour activer le chargement différé.

Avec l'approche ci-dessus, vous pouvez gérer efficacement le chargement des propriétés de navigation dans EF Core, éviter les problèmes de valeurs nulles et améliorer la prévisibilité du code.

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