Entity Framework: Wie deaktiviere ich das verzögerte Laden für eine bestimmte Abfrage?

86

Gibt es eine Möglichkeit, das verzögerte Laden für bestimmte Abfragen in Entity Framework 6 zu deaktivieren? Ich möchte es regelmäßig verwenden, aber manchmal möchte ich es deaktivieren. Ich verwende virtuelle Eigenschaften, um sie faul zu laden.

Marco Alves
quelle
20
set context.Configuration.LazyLoadingEnabled = false; vor der Abfrage, die Sie ausführen möchten
Karthik Ganesan
5
Sie könnten den Wert einfach einstellen this.Configuration.LazyLoadingEnabled = false;und dann erneut einstellen this.Configuration.LazyLoadingEnabled = true;? Sie können auch diese msdn.microsoft.com/en-us/data/jj574232.aspx
user1477388
1
danke @KarthikGanesan. Es hat wie erwartet funktioniert.
Marco Alves
@KarthikGanesan Kannst du deinen Kommentar als Antwort geben? Es funktioniert wirklich gut :)
Sampath
1
Kommentar als Antwort hinzugefügt @Sampath
Karthik Ganesan

Antworten:

75

Legen Sie den folgenden Code vor der Abfrage fest, die Sie ausführen möchten

context.Configuration.LazyLoadingEnabled = false;
Karthik Ganesan
quelle
40

Sie können das verzögerte Laden für bestimmte Abfragen wie folgt deaktivieren:

public static Cursos GetDatosCursoById(int cursoId)
{
    using (var bd = new AcademyEntities())
    {
        try
        {
            bd.Configuration.ProxyCreationEnabled = false;
            return bd.Cursos.FirstOrDefault(c => c.cursoId == cursoId);
        }
        catch (Exception ex)
        {
            return null;
        }
    }
}
William Ballesteros
quelle
20

Möglicherweise fehlt mir hier etwas, aber anstatt die Konfiguration jedes Mal zu ändern, könnte ein anderer Ansatz darin bestehen, .Include()nur die Abfragen zu verwenden, bei denen Sie eifrig laden möchten?

Angenommen, wir haben eine ProductKlasse, die eine Navigationseigenschaft für eine ColourKlasse hat, dann könnten Sie die Colourfür eine solche laden Product-

var product = _context.Products
    .Where(p => p.Name == "Thingy")
        .Include(x => x.Colours)
        .ToList();
Parrybird
quelle
1
Für mich ist dies die beste Antwort hier!
Ian
Dies ist unzureichend, wenn Sie nur "Produkte" ohne Includes laden möchten.
Mackan
Sie möchten also "Produkte" ohne zugehörige Objekte oder "Produkte mit allen zugehörigen Objekten" erhalten?
Parrybird
1
Viel nützlichere Antwort. Dies steuert die spezifischen untergeordneten Tabellen, die an dem Punkt geladen werden, an dem die Abfrage erstellt wird. Für jedes Problem der realen Welt muss dies der richtige Weg sein.
Richard Petheram
5
Es ist auf eine andere Art nützlich ... wenn Sie es auf diese Weise tun, könnte es immer noch zu einem verzögerten Laden für eine andere Sammlung von 'Produkte' kommen. Das Deaktivieren des verzögerten Ladens ist effektiver, um sicherzustellen, dass alle benötigten Daten im Voraus abgerufen werden, und um versteckte Leistungsengpässe zu vermeiden.
Doug
15

Gehen Sie zu Ihren Diagrammeigenschaften und suchen Sie eine Eigenschaft, die zum verzögerten Laden bestimmt ist, und deaktivieren Sie sie.

Wenn Sie zuerst Code verwenden, gehen Sie zu Ihrem Konfigurationsbereich und deaktivieren Sie ihn von dort aus mit:

this.Configuration.LazyLoadingEnabled = false;
Juan
quelle
6
Viele Leute besuchen diese Frage und ich möchte sagen, dass Leute KEINE FRAGEN SCHREIBEN, ohne einen Blick auf den Ausführungsplan zu werfen. Sie müssen immer wissen, was Ihr Code an die Datenbank sendet, da sonst Leistungsprobleme auftreten. Sie können Linq Pad oder andere Tools verwenden, um die tatsächliche Abfrage anzuzeigen und zu überprüfen.
Juan
9

In EF Core: context.ChangeTracker.LazyLoadingEnabled = false;

Per dieser Antwort .

Matt Jenkins
quelle
3

Ein weiterer Ansatz für eine andere EF-Version (Entity Framework 5)

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 
Fubo
quelle
Wann contextist ein ObjectContext, der mehr oder weniger veraltete Vorgänger seines Wrappers , DbContext.
Gert Arnold
2

Angenommen, Sie haben Folgendes:

IOrderedQueryable<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite);
}

Sie würden immer noch faul laden, trotz der expliziten Einstellung, dies nicht zu tun. Das Update ist einfach, ändern Sie es wie folgt:

List<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    // context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite).ToList();
}
Hochburg
quelle