6

J'utilise EF 4.1 et code-first dans un projet MVC, et AutoMapper pour mapper des entités pour afficher des modèles. Avant d'utiliser le code d'abord, j'ai été capable d'exclure les propriétés de navigation afin d'empêcher tout chargement qui n'était pas déjà fait. J'utilise .Include() dans mes requêtes pour inclure les références dont j'ai besoin afin d'éviter des allers-retours de bases de données supplémentaires.Comment mapper des entités avec des propriétés de chargement différé (sans provoquer leur chargement)?

Cependant, avec le code d'abord mon entité expose seulement une propriété d'entité (ou ICollection s'il y en a plus d'un). Comment puis-je savoir s'il a été chargé sans déclencher la charge?

En supposant que cela soit possible, existe-t-il un moyen d'en faire le comportement par défaut pour AutoMapper, de sorte que je n'ai pas à exclure explicitement les membres de chaque entité?

Répondre

10

Vous pouvez vérifier si une propriété de navigation de référence ou d'une collection d'un entity a été chargé par:

bool isLoaded1 = dbContext.Entry(entity).Reference(e => e.MyReferenceProperty) 
        .IsLoaded(); 
bool isLoaded2 = dbContext.Entry(entity).Collection(e => e.MyCollectionProperty) 
        .IsLoaded(); 
+1

Merci, c'est exactement ce dont j'ai besoin. Dommage que j'ai besoin du contexte, peut-être ajouter des helpers sur mon dépôt pour cela. –

2

Vous devriez être en mesure de les explicitly load en désactivant chargement paresseux:

using(var context = new FooBarEntities()) 
{ 
    context.ContextOptions.LazyLoadingEnabled = false; 
    Foo foo = context.Foo.Where(x => x.Id == myId).Single(); 
    ... 
    if(!foo.Bars.IsLoaded) 
    { 
     foo.Bars.Load(); 
    } 
    //do something with foo.Bars here 
} 
+1

Je pense qu'avec EF4.1 et Code-First il a des POCOs, donc 'IsLoaded' et' Load' ne seront pas disponibles dans les propriétés de navigation. – Slauma

+0

Merci, désactivant le chargement paresseux pourrait également être une option - va voir ce qui fonctionne le mieux. –

4

Code EF Effectue d'abord un chargement paresseux uniquement pour les propriétés marquées comme virtuelles (il peut les remplacer et placer DynamicProxy à la place). Si vous ne rendez pas votre propriété virtuelle, vous allez désactiver le chargement paresseux pour cette propriété.

Questions connexes