navigationseigenschaft sollte virtuell sein - nicht erforderlich in ef core?

9

Wie ich mich in EF erinnere Navigationseigenschaft sollte virtuell :

%Vor%

Aber ich schaue mir EF Core an und sehe nicht es als virtuell:

%Vor%

Wird es nicht mehr benötigt?

    
Alexan 26.01.2017, 19:14
quelle

5 Antworten

21

virtual wurde in EF nie benötigt . Es wurde nur benötigt, wenn Sie Unterstützung für das verzögerte Laden wünschen.

Seit Lazy Loading wird von EF Core noch nicht unterstützt , derzeit virtual haben keine besondere Bedeutung. Es würde, wenn (und wenn) sie Lazy Loading Support hinzufügen (es gibt einen Plan dafür).

    
Ivan Stoev 26.01.2017, 19:22
quelle
9

Es wurde nie benötigt ...

Dank der Antwort von anderen hier sehe ich, dass der EF-Core nicht einmal das Lazy-Laden unterstützt ... Es macht das virtuelle Schlüsselwort ziemlich ... nutzlos in CORE

ABER NORMAL:

1. wenn Sie Ihre Eigenschaft als virtuell deklarieren:

Ihre virtuelle Eigenschaft (standardmäßig) wird nicht sofort beim Abfragen des Hauptobjekts geladen. Es wird nur von der Datenbank retreive, wenn Sie versuchen, darauf zuzugreifen, oder auf eine seiner Komponenten zugreifen.

Und das nennt man lazy loading.

2. wenn Sie es nicht virtuell deklarieren:

Ihre Eigenschaft wird (standardmäßig) sofort zusammen mit allen anderen Eigenschaften in Ihrer Haupteinheit geladen. Dies bedeutet, dass Ihre Immobilie für den Zugriff bereit ist: Sie wurde bereits reaktiviert. Die Entität muss die Datenbank nicht erneut abfragen, weil Sie auf diese Eigenschaft zugreifen.

Dies wird als eifrig geladen bezeichnet.

Meine Meinung:

Meistens wähle ich eifrig laden (nicht-virtuell), weil die meiste Zeit, ich brauche jede Eigenschaft jeder Entität verwendet werden muss, ohne zurück zu fragen (schneller, wenn Sie wirklich alles schnell wollen), aber wenn Sie Greife nur von Zeit zu Zeit auf diese Eigenschaft zu (du hast nichts aufgelistet) und du willst öfter nur den Rest der Informationen, außer DIESE, und mach es dann virtuell, damit diese Eigenschaft den Rest der Abfrage nicht nur für einige wenige verlangsamt Zugang.

Ich hoffe, das war klar ...

Beispiele:

Wo würde ich nicht virtuell (eifrig):

%Vor%

Wo würde ich virtuelles oder faules Laden verwenden:

%Vor%

eine letzte Sache:

Wenn Sie nicht mehr als 1 000 Zeilen einer Datenbank abfragen, hat das, was Sie wählen, keinen großen Effekt. Außerdem können Sie diese Eigenschaft virtuell deklarieren und wenn Sie umgekehrt testen möchten, müssen Sie nur Folgendes tun:

%Vor%

Damit wird der virtuelle Effekt aufgehoben.

Bearbeiten

Für neuere Versionen von EF:

%Vor%     
Antoine Pelletier 26.01.2017 19:27
quelle
3

In EF Core wurde standardmäßig der Pfad des entmutigenden Lazy Loads gewählt. Auch ich denke, dass diese Funktion nach diesem Problem immer noch nicht implementiert ist.

Ссылка

Mit den früheren EF-Versionen durften die virtuellen Navigationseigenschaften die zugehörigen Entitäten lazy laden.

Ich denke, das Laden der Navigationseigenschaften für den Moment kann nur mit .Include(...)

erreicht werden

BEARBEITEN:

Es gibt mehrere Möglichkeiten zum Laden verwandter Entitäten, die in Core unterstützt werden. Wenn Sie interessiert sind: Ссылка

    
vasil oreshenski 26.01.2017 19:20
quelle
2

Seit der Annahme der angenommenen Antwort haben sich die Dinge geändert. Im Jahr 2018 wird Lazy Loading ab Entity Framework Core 2.1 unterstützt für zwei verschiedene Ansätze.

Der einfachere Weg der beiden ist die Verwendung von Proxies, und dazu müssen die Eigenschaften, die langsam geladen werden sollen, mit virtual definiert werden. Um von der verlinkten Seite zu zitieren:

  

Die einfachste Möglichkeit, Lazy-Loading zu verwenden, besteht darin, das Microsoft.EntityFrameworkCore.Proxies-Paket zu installieren und es mit einem Aufruf von UseLazyLoadingProxies zu aktivieren. [...] EF Core aktiviert dann das Lazy-Laden für jede Navigationseigenschaft, die überschrieben werden kann - das heißt, sie muss virtuell sein und auf einer Klasse basieren, von der geerbt werden kann.

Und hier ist der Beispielcode:

%Vor%

Es gibt eine andere Möglichkeit, Lazy Loading ohne Proxies durchzuführen, nämlich ILazyLoader in den Konstruktor des Datentyps zu injizieren. Dies wird hier erklärt .

Kurz gesagt, gibt es zwei Möglichkeiten, Lazy Loading durchzuführen: mit und ohne Proxies. virtual ist erforderlich genau dann, wenn Sie Lazy Loading mit Proxies unterstützen möchten. Ansonsten ist es nicht.

    
BrokenBacon 02.04.2018 18:49
quelle
1

Update: Eine anfängliche Implementierung von Lazy Loading, die für EF Core 2.1 geplant ist, erfordert, dass Navigationseigenschaften als virtuell deklariert werden. Siehe Ссылка und allgemeiner den Fortschritt beim verzögerten Laden verfolgen, siehe Ссылка .

    
SvenAelterman 05.02.2018 22:42
quelle