2016-10-19 1 views
11

Verbeugung meiner Sicht Studios Anfrage, begann ich mein neuestes Projekt mit Entity Framework-Core (1.0.1)Entity Framework-Kern - Lazy Loading-

Schreiben Also meine Datenbankmodelle, wie ich immer die ‚virtuelle‘ Spezifizierer haben mit zu Aktivieren Sie das verzögerte Laden für eine Liste. Beim Laden der Elterntabelle scheint es jedoch, dass die Kinderliste niemals geladen wird.

Eltern Modell

public class Events 
{ 
    [Key] 

    public int EventID { get; set; } 
    public string EventName { get; set; } 
    public virtual List<EventInclusions> EventInclusions { get; set; } 
} 

Child Modell

public class EventInclusions 
{ 
    [Key] 
    public int EventIncSubID { get; set; } 
    public string InclusionName { get; set; } 
    public string InclusionDesc { get; set; } 
    public Boolean InclusionActive { get; set; } 

} 

neue Datensätze zu diesen Tabellen Hinzufügen scheint zu arbeiten, wie ich es gewohnt bin, wo ich kann Nest die EventInclusions Einträge als Liste im Ereignisdatensatz.

Obwohl, wenn ich Abfrage dieser Tabelle

_context.Events.Where(e => e.EventName == "Test") 

der Heftausgabe

EventInclusions wird ein Null-Wert zurück, unabhängig von den Daten hinter den Kulissen.

Nach einem bisschen Lesen ich das Gefühl, mich immer das ist ein Wechsel zwischen EF6, die ich verwende und EF-Core normalerweise

ich entweder macht eine Decke Lazy Loading-auf Anweisung oder herauszufinden, das neue Format etwas Hilfe gebrauchen könnte zum Spezifizieren von Lazy Loading.

Caz

+0

Haben Sie Lazy Loading für den Kontext aktiviert? – Gusman

+0

Hey Gusman, ich hatte nie in EF6 benötigt - ich vermute, dass könnte in dem Problem sein, weil ich nichts in Bezug auf Lazy Loading in meinem Kontext haben – Caz1224

+0

Wenn sie den gleichen Mechanismus beibehalten haben (ich noch EF nicht mit Core verwendet) Dann müssen Sie 'Configuration.LazyLoadingEnabled = true;' und 'Configuration.ProxyCreationEnabled = true;' im Konstruktor des Kontextes setzen. – Gusman

Antwort

17

So scheint es, dass EF-Core momentan nicht verzögertes Laden unterstützen. Es kommt aber vielleicht eine Weile weg.

Für jetzt, wenn jemand anderes auf dieses Problem stößt und kämpft. Unten ist eine Demo der Verwendung von Eager loading was ist für was Sie jetzt verwenden müssen.

Sagen Sie, bevor Sie ein Personenobjekt hatten und dieses Objekt eine Liste von Hüten in einer anderen Tabelle enthielt.

Anstatt das Schreiben

var person = _context.Person.Where(p=> p.id == id).ToList(); 

person.Hats.Where(h=> h.id == hat).ToList(); 

Sie benötigen

var person = _context.Person.Include(p=> p.Hats).Where(p=> p.id == id).ToList(); 

zu schreiben und dann wird person.Hats.Where(h=> h.id == hat).ToList(); arbeiten

Wenn Sie mehrere Listen haben - Kette der Includes

Ich verstehe, warum diese Methode sicherer ist, dass Sie keine großen Datenmengen laden, die die Dinge verlangsamen könnten. Aber ich hoffe, sie bekommen Lazy bald wieder zurückladen !!!

Caz

+4

Haben Sie eine Idee, wie Sie das Repository-Muster implementieren, wenn ich die Navigationseigenschaften eifrig laden muss? das ist überhaupt nicht leicht, wenn Sie eine unbekannte Anzahl von 'include' Funktionen in Not haben ... irgendwelche Ideen? –

+1

@MohammedNoureldin Ich stieß auf das gleiche Problem. Am Ende "löste" ich es, indem ich das IQueryable bloßlegte. z.B. Ich habe jetzt Dinge wie eine IQueryable GetByIdQueryable (String-ID) -Methode auf meinem Repository. Anrufer können dann _repo.GetByIdQueryable (id) .Include (b => b.RelatedEntityProperty) .SingleOrDefault(); Es funktioniert und ist sogar in Ordnung mit Unit-Tests, aber für mich ist es ein bisschen ein Geruch, dass Sie es auf diese Weise aussetzen müssen. Eine andere Alternative wäre, die String-Namen der Eigenschaften, die Sie einfügen möchten, zu übergeben, aber das fragt nur nach Problem-Imo. – Steve

4

Lazy Loading ist noch nicht von EF-Core unterstützt, aber es gibt eine nicht-offizielle Bibliothek, die Lazy Loading ermöglicht: https://github.com/darxis/EntityFramework.LazyLoading. Sie können es verwenden, bis es offiziell unterstützt wird. Es unterstützt EF Core v1.1.1. Es ist als nugget-Paket erhältlich: https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.LazyLoading/

Haftungsausschluss: Ich bin der Besitzer dieses Repo und laden Sie ein, es auszuprobieren, Probleme zu melden und/oder beizutragen.

+1

Bitte tun Sie etwas, um EF Core 2.0 zu unterstützen. –

1

Lazy Load ist geplant, um in EF-Kern 2.1 zu sein - Sie können mehr darüber lesen, warum es ein Muss-Feature - here ist.

+0

Link defekt und wenn behoben, Login erforderlich. Gibt es eine öffentlich zugängliche Quelle? –

+0

Link behoben: D Danke, dass Sie mich wissen lassen. Sobald die Lazy Load zu EF7 kommt, wird es benutzbar sein ... darauf warten für fast ein Jahr ... – baHI