2016-08-24 4 views
0

Ich fange gerade an, mit EF-Kern (mit NPGSQL) zu spielen, und habe ein seltsames Verhalten bemerkt, wie Navigationseigenschaften geladen werden, ohne ausdrücklich ein 'include' zu verwenden. Ein Beispiel ich sehe:Entity Framework Core Navigationseigenschaften über-eifrig laden

ObjectA

ObjectA-> Liste ObjectB | ObjectA-> Liste ObjectC

ObjectB-> Liste ObjectD

Alle der Navigationseigenschaften eingerichtet sind, und es gibt Elemente jedes Typs in der Datenbank.

Ich führe eine Abfrage auf ObjectA ohne irgendwelche Includes, so dass die Nav-Eigenschaften leer sein sollten. Das ist nicht der Fall; Abhängig von der Abfrage wird manchmal einer von ihnen ohne ein explizites Include ausgefüllt (nicht beides, nur ObjectB oder ObjectC). Wenn ich das explizite Include mache, erscheinen beide wie erwartet. Das ist ärgerlich, aber nicht das wirklich schlimme Problem, das ich sehe.

Angenommen, ich frage ein ObjectC ab. Wenn ich alle nav -Eigenschaften eingerichtet habe, wird ObjectA wie erwartet geladen, aber jetzt werden in ObjectA auch ALLE nav -Eigenschaften geladen. nicht nur, was sich auf ObjectC bezieht. ALLE Kinder von ObjectA (und ihre Kinder) kommen ebenfalls zurück. Dies führt dazu, dass hunderte von Artikeln zurückkommen, die absolut nichts mit dem zu tun haben, was angefordert wurde.

Das ist Code-zuerst (ich erstelle die DB von Hand obwohl seit Gerüst in NPGSQL sehr fehlerhaft scheint). Hier ist ein Beispiel dafür, wie die Eltern-Beziehung für eine meiner Einheiten modelliert wird:

entity 
    .HasOne<User>(c => c.User) 
    .WithMany(p => p.Addresses) 
    .HasForeignKey(c => c.UserId) 
    .OnDelete(DeleteBehavior.Restrict) 
    .HasConstraintName<User, Address>("fk_addresses_user"); 

Wenn ich eine einzelne Adresse abfragen, wird der übergeordnete Benutzer nach hinten gezogen, aber unter, dass jeder einzelne andere Adresse an den Benutzer gebunden und (Dies ist eine Ein-Ebenen-Assoziation, aber wenn Address irgendwelche Kinder hätte, würden sie alle ebenfalls zurückgezogen werden).

Ich bin im Moment ratlos; Das einzige, was ich tun konnte, ist, alle Kind-Navigationseigenschaften aus meinem Modell zu entfernen.

+0

Sind die Navigationseigenschaften als 'virtuell' definiert? –

+0

IIRC, Entity Framework hat eine Option, um Lazy Loading zu erzwingen (oder zu deaktivieren, eifrig laden) –

+0

Können Sie bitte einige tatsächliche Code veröffentlichen, damit wir sehen können, was Sie tun? Bitte posten Sie auch Ihr Modell. Kannst du bitte Probleme mit Gerüsten, die du hast, öffnen? Im Moment ist mir nichts Ernstes bekannt. –

Antwort

0

Ich denke, ich sehe, was es jetzt macht. Es enthält automatisch andere Eigenschaften, die bereits lokal verfolgt werden (was sinnvoll ist, nehme ich an). Bei meinen Tests habe ich mehrere Artikel gleichzeitig gelesen/erstellt, und ich war verwirrt, dass einige Dinge ohne explizite Aufnahme ausgefüllt wurden. Nach mehr Tests verhält es sich so, wie ich es erwarte, wenn ich einfachere Abfragen habe, die nicht auf andere Entitäten im selben Kontext zugreifen.

Verwandte Themen