Heim >Backend-Entwicklung >C++ >Warum sind EF Core-Navigationseigenschaften null, bis sie explizit geladen werden, und wie kann ich sie konsistent auffüllen?
ef Core verzögerte das Problem des leeren Wertes und die Lösung des Navigationattributs
Problembeschreibung
Betrachten Sie das folgende Modell:
<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>Definieren Sie die Beziehung in der
-Methode von dbContext: OnModelCreating
<code class="language-csharp">modelBuilder.Entity<Mutant>() .HasOne(m => m.OriginalCode) .WithMany(oc => oc.Mutants) .HasForeignKey(m => m.OriginalCodeId) .OnDelete(DeleteBehavior.Restrict);</code>Beim Abfragen von Mutante war das
-Treizattribut ursprünglich leer. Wenn Sie jedoch die Mutante überprüfen, bevor Sie die Mutante abfragen, wird das Attribut OriginalCode
gefüllt. OriginalCode
OriginalCode
Analyse der Ursache
Die "ladenbezogenen Daten" des EF -Kerndokuments erläuterte dieses Verhalten:
Entity Framework Core unterstützt keine Verzögerungsbelastung. Normalerweise ist das Navigationsattribut leer, bevor Sie sie durch Vorladung oder explizit geladen haben.
enthält jedoch der Teil "Pre -load" Folgendes:
Tipps
Entity Framework Core repariert automatisch alle Navigationsattribute, die in der Kontextinstanz an andere Entitäten geladen wurden. Selbst wenn Sie keine explizite Daten mit Navigationsattributen enthalten, kann das Attribut noch gefüllt werden, wenn einige oder alle zugehörigen Entitäten geladen wurden.Lösen Sie das erste Problem (Navigationsattribute sind leer):Lösung
Die Methode zur Verwendung verfügbarer ladenbezogener Daten wie Vorladung:
Lösen Sie das zweite Problem (vorgeladen Die relevanten Entitäten verursachten, dass die Navigationsattribute ausgefüllt wurden):
Dieses Verhalten ist "gestaltet" und kann nicht kontrolliert werden. Um dies zu vermeiden:
<code class="language-csharp">var mutants = db.Mutants.Include(m => m.OriginalCode).ToList();</code>Verwenden Sie für jede Abfrage eine neue DBContext -Instanz.
Verwenden Sie ohne Verfolgung von Abfragen ().
AsNoTracking()
Alle Navigationsattribute als NUGET -Beutel installieren. Verwenden Sie Verspätungsladung aktivieren.
Mit den oben genannten Methoden können Sie die Navigationsattribute im EF -Kern effektiv verwalten, um Leerstandsprobleme zu vermeiden und die Vorhersagbarkeit des Codes zu verbessern.
Das obige ist der detaillierte Inhalt vonWarum sind EF Core-Navigationseigenschaften null, bis sie explizit geladen werden, und wie kann ich sie konsistent auffüllen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!