2017-07-03 1 views
1

J'ai quelques difficultés à comprendre comment Entity Framework joint les relations d'entité pour les entités en mémoire.Entity Framework définit automatiquement la relation bien que les proxies soient désactivés

Pour interroger avec Entity Framework désactiver la création proxy et le chargement paresseux:

public static CoreContext GetReadCoreContext() 
{ 
    var context = GetCoreContext(); 
    context.Configuration.ProxyCreationEnabled = false; 
    context.Configuration.LazyLoadingEnabled = false; 
    return context; 
} 

Depuis que j'ai certains types hérités du modèle ER et je veux inclure certaines entités uniquement lorsque le type hérité est spécifique Un, j'ai besoin de faire deux requêtes distinctes. Seul un type spécifique contient une relation avec Localization. S'il vous plaît ne pas que ce soit seulement pour illustrer pourquoi Je dois faire deux requêtes distinctes et n'est pas nécessairement liée à mes luttes pour comprendre le mécanisme d'Entity Framework.

Tout d'abord j'interroger la partie générale, qui ne dépend pas du type spécifique:

var myGuid = Guid.Parse("6a81de0b-ce4b-44dc-a693-ca4e13e7d2ab"); 

using (var ctx = ContextFactory.GetReadCoreContext(TenantId)) 
{ 
    var entitiesQuery = ctx.MyEntity 
     .Include(i => i.EntityA) 
     .Include(i => i.GeneralType); 

    var myEntity = entitiesQuery.FirstOrDefault(e => e.Id == myGuid); 

    // check if myEntity.GeneralType is of the specialized type then query depending on the properties of this type 

    var specificEntity = myEntity.GeneralType as SpecificType; 
    if (specificEntity != null) 
    { 
     var myLocalization = ctx.Localizations.Where(l => l.Id == specificEntity.LocalizationId) 

     // Entity Framework is automatically setting myEntity.Localization to myLocalization 
    } 
} 

Ce que je ne comprends pas, comment Entity Framework append/définir la relation de l'objet en mémoire . Notez que l'objet en mémoire n'est pas un proxy - sinon je comprendrais pourquoi cela fonctionne.

Lorsque j'utilise .AsNoTracking() le comportement décrit ci-dessus ne fonctionne pas.

+1

Je pense que vous interprétez mal la signification de chargement paresseux. La désactiver signifie que EF n'effectuera pas de déplacements supplémentaires automatiques dans la base de données lorsque vous accéderez à une propriété de navigation qui n'est pas dans le contexte (car elle n'a pas été chargée avec un 'Include' ou explicitement obtenue avec une requête). Mais si l'entité dans cette propriété de navigation est déjà dans le contexte (parce qu'elle a été interrogée et attachée au contexte avant), vous le verrez, car EF est conscient des relations entre les entités, et une propriété de navigation est juste une référence à une entité dans le contexte. – Diana

+0

Et à propos de proxies, ils doivent être activés si le chargement paresseux est activé, , mais il existe certains scénarios où vous activez Proxies et désactiver le chargement paresseux. Les proxies sont liés au suivi des états des entités. [Ici] (https://stackoverflow.com/questions/25720006/ef-6-1-difference-between-proxycreationenabled-and-lazyloadingenabled) vous pouvez trouver une explication de la combinaison des valeurs de 'ProxyCreationEnabled' et' LazyLoadingEnabled'. – Diana

+0

Peut-être que vous voulez poster votre commentaire comme réponse afin que je puisse le marquer comme la solution. Vraiment m'a aidé avec mon problème de compréhension. – officer

Répondre

2

Je pense que vous interprétez mal la signification de Lazy Loading. La désactiver signifie que EF n'effectuera pas de déplacements supplémentaires automatiques dans la base de données lorsque vous accéderez à une propriété de navigation qui n'est pas dans le contexte (car elle n'a pas été chargée avec un Include, ou explicitement obtenue avec une requête). Mais si l'entité dans cette propriété de navigation est déjà dans le contexte (parce qu'elle a été interrogée et attachée au contexte avant), vous le verrez, car EF est conscient des relations entre les entités, et une propriété de navigation est juste une référence à une entité dans le contexte.

Et sur les proxies, ils doivent être activés si le chargement par chargement est activé, mais il existe certains scénarios dans lesquels vous activez les proxys et désactivez le chargement paresseux. Les proxies sont liés au suivi des états des entités. Here vous pouvez trouver une explication de la combinaison des valeurs de ProxyCreationEnabled et LazyLoadingEnabled

+0

Notez également que cette "correction de relation" est une caractéristique du suivi des modifications EF. Si vous désactivez le suivi des modifications pour une requête, il désactivera ce comportement. –