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.


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;

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;
        }
    }
}

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();

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;

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


3

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

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 

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();
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.