Entity Framework: comment désactiver le chargement différé pour une requête spécifique?


88

Existe-t-il un moyen de désactiver le chargement différé pour une requête spécifique sur Entity Framework 6? Je veux l'utiliser régulièrement, mais parfois je veux le désactiver. J'utilise des propriétés virtuelles pour les charger paresseusement.


20
set context.Configuration.LazyLoadingEnabled = false; avant la requête que vous souhaitez exécuter
Karthik Ganesan

5
Vous pouvez simplement définir la valeur this.Configuration.LazyLoadingEnabled = false;, puis la redéfinir this.Configuration.LazyLoadingEnabled = true;? En outre, vous pouvez lire ce msdn.microsoft.com/en-us/data/jj574232.aspx
user1477388

1
merci @KarthikGanesan. Cela a fonctionné comme prévu.
Marco Alves

@KarthikGanesan Pouvez-vous mettre votre commentaire en réponse? Ça marche vraiment bien :)
Sampath

1
Ajouté le commentaire en tant que réponse @Sampath
Karthik Ganesan

Réponses:


76

définissez le code suivant avant la requête que vous souhaitez exécuter

context.Configuration.LazyLoadingEnabled = false;

40

Vous pouvez désactiver le chargement différé pour une requête spécifique comme suit:

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

Il me manque peut-être quelque chose ici, mais plutôt que de changer la configuration à chaque fois, une autre approche pourrait-elle consister à n'utiliser .Include()que les requêtes pour lesquelles vous souhaitez charger avec impatience?

Supposons que nous ayons une Productclasse qui a une propriété de navigation vers une Colourclasse, vous pouvez charger le Colourpour un Productcomme ceci -

var product = _context.Products
    .Where(p => p.Name == "Thingy")
        .Include(x => x.Colours)
        .ToList();

1
Pour moi, c'est la meilleure réponse ici!
Ian

Cela ne suffit pas si vous voulez seulement charger des "produits" avec impatience, sans aucune inclusion.
Mackan

Vous voudriez donc obtenir des "Produits" sans aucun de leurs objets associés, ou "Produits avec tous leurs objets associés?"
Parrybird

1
Réponse beaucoup plus utile. Cela contrôle les tables de sous-ordonnées spécifiques qui sont chargées au point où la requête est en cours de construction. Pour tout problème du monde réel, cela doit être la voie à suivre.
Richard Petheram

5
C'est utile d'une manière différente ... si vous le faites de cette façon, on pourrait toujours obtenir un chargement paresseux pour une autre collection à partir de 'Produits'. En fait, la désactivation du chargement différé est plus efficace pour garantir que toutes les données nécessaires sont récupérées à l'avance et éviter de créer des goulots d'étranglement cachés des performances.
Doug

15

Accédez aux propriétés de votre diagramme et recherchez une propriété désignée pour le chargement différé et désactivez-la.

Si vous utilisez d'abord le code, accédez à votre zone de configuration et désactivez-le à partir de là avec:

this.Configuration.LazyLoadingEnabled = false;

6
Beaucoup de gens visitent cette question et je tiens à dire, les gens N'ÉCRITENT PAS DE QUESTIONS SANS PRENDRE UN REGARD SUR LE PLAN D'EXÉCUTION. Sachez toujours ce que votre code envoie à la base de données ou vous aurez des problèmes de performances. Vous pouvez utiliser linq pad ou d'autres outils pour afficher la requête réelle et vérifier.
Juan


3

Une autre approbation pour une autre version d'EF (Entity Framework 5)

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

Quand contextest un ObjectContext, le prédécesseur plus ou moins dépréciée de son emballage, DbContext.
Gert Arnold le

2

Supposons que vous ayez ceci:

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

Vous obtiendrez toujours un chargement paresseux, malgré le paramètre explicite de ne pas faire. Le correctif est simple, changez-le en ceci:

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();
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.