2016-05-04 15 views
0

Wenn ich drei Klassen A, B und C:Entity Framework - Fügen Sie mit mehreren Ebenen

class A { 
    public B b { get; set; } 
    public C c { get; set; } 
} 

class B { 
    public C c { get; set; } 
} 

class C { 
    ... 
} 

Wenn ich eine Abfrage machen, wie:

Context.A.Where(...).Include(x => x.b).Include(x => x.c); 

Entity das C-Objekt sowohl in der A lädt und B, Duplizieren von Daten. Gibt es einen Weg, das zu verhindern? Ich benutze kein faules Laden.

+4

Wenn Sie nicht wollen, C dann warum es aufnehmen? Auf der anderen Seite, wenn C ist buchstäblich das gleiche Objekt, dann ist es nicht Daten duplizieren. –

+0

Was bekommen Sie, wenn Sie einfach Context.A.Where (...) verwenden? Was fehlt Ihnen, die Sie einschließen müssen? – nurdyguy

+0

ich will c, ich will es einfach nicht zweimal. sein Kommen verdoppelt sich auf beiden Objekten, A und B. –

Antwort

1

Sie anweisen, Entity Framework die b und c Einheiten mit dem A Set zu laden. Da die b Artikel Verweise auf Elemente des Typs C enthalten dass könnte die gleichen geladenen Gegenstände tatsächlich sein, mit den ein Objekte, dann wird Entity Framework sie verwenden, um die Objekte Graph zu konstruieren. Das bedeutet nicht, dass Entity Framework einen zusätzlichen SQL-Join generiert, um die Elemente c für den Typ B zu laden. Um dies zu tun, würden Sie schreiben

Context.A.Where(...).Include(x=>x.b).Include(x=>x.c).Include(x=>x.b.c) 
+0

Meiner Meinung nach, mit der Abfrage, die ich gemacht habe, ist das korrekte Laden nur a.b und ac.c. Wenn ich b.c wollte, sollte ich .Include schreiben (x => x.b.c). Ich lade nicht b.c, aber es kommt gefüllt, dupliziert eine Menge Daten. –

+0

Es werden keine Daten dupliziert. a.b.c und a.c verweisen auf denselben Speicherort. –

+0

nun, meine json antwort sollte nur ein objekt vom typ c enthalten. Es kommt dadurch viel größer. für mich ist es Duplizieren von Daten: / –

Verwandte Themen