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?
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 :
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 :
virtual
. Microsoft.EntityFrameworkCore.Proxies
package NuGet. 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!