2016-07-19 6 views
0

Verwendung von Entity Framework Core (7) Ich habe folgende Einheiten:Entity Framework-Abfrage lädt untergeordnete Eigenschaften in eine andere Variable. Warum?

public class Person { 
    public Int32 Id { get; set; } 
    public virtual Address Address { get; set; } 
} 

public class Address { 
    public Int32 PersonId { get; set; } 
    public String City { get; set; } 
} 

Dann lief ich die folgenden Abfragen mit einem Haltepunkt in der zweiten Zeile.

List<Context.Person> a = context.Persons.ToList(); 

List<Context.Person> b = context.Persons.Include(x => x.Address).ToList(); 

Wenn ich überprüfen Sie die Variable „a“ die Adresse in jedem Listenelement ist null, was Sinn macht, weil ich nicht Adresse in der ersten Abfrage einschließlich bin.

Dann erlaube ich die zweite Abfrage zu laufen und ich sehe, dass die Adresse in "b" Listenelemente eine andere Adresse als null haben, was auch Sinn macht, weil ich es einschließe.

Was ist seltsam ist, dass, nachdem ich "b" die Adresse in "a" Elemente geladen ist.

Warum? Kann ich das vermeiden?

Ich erstelle ein paar Tests und das ist ein Verhalten, das ich vermeiden möchte.

+0

das Problem ist Ihr Zusammenhang wird immer größer, wie Sie die Adressen enthalten, und damit die a.Address Eigenschaft als gut gefüllt. Versuchen Sie, die Adressen in einem anderen Kontext hinzuzufügen - möglicherweise hilft auch das Deaktivieren von Lazy Loading. – DevilSuichiro

+0

Lazy Loading ist in Entity Framework Core nicht vorhanden ... Gibt es eine andere Möglichkeit, dies zu lösen, ohne 2 Kontexte zu verwenden? Meine Listen haben nur 8 Datensätze und jede 1 Adresse. Ich finde es komisch, dass das so ist ... –

Antwort

1

Warum?

Da durch Standardabfragen, die Entitätstypen zurückgeben sind Tracking queries, was bedeutet, dass die Person Objektinstanzen in Ihrem Fall werden durch den gleichen Zusammenhang zwischen den beiden Anrufen geteilt. Und weil sie Referenztypen sind, ist die geladene Information durch die spätere Abfrage auch im Ergebnis des ersten sichtbar.

Kann ich das vermeiden?

können Sie No-tracking queries verwenden:

var a = context.Persons.AsNoTracking().ToList();