Pourquoi EF renvoie-t-il une classe de proxy au lieu de l’entité réelle?

J’ai des problèmes avec la structure d’entité renvoyant des procurations lorsque je veux la classe d’entités réelle. La première fois que je lance mon code, tout fonctionne correctement (pas de proxy), mais à chaque itération, l’un de mes ensembles de bases de données renvoie toujours des proxy au lieu du type réel.

Je dispose du contexte après chaque itération, donc je ne comprends pas pourquoi la première fois, cela fonctionne, et chaque fois, non.

Mon code échoue sur cette ligne. Tous les POCO ont l’atsortingbut Table défini, mais comme il retourne une classe proxy, il n’y a pas d’atsortingbut de table.

TableAtsortingbute atsortingb = (TableAtsortingbute)atsortingbutes.Single(); 

Y a-t-il de la magie statique en coulisse dans le DbContext qui subsiste après la destruction de l’object?

Je déplace mes objects en mémoire en utilisant ce qui suit

 MajorClasses = ctx.MajorClasses.ToArray(); 

J’ai aussi essayé

 MajorClasses = ctx.MajorClasses.AsNoTracking().ToArray(); 

Dans mon OnModelCreating j’ai l’ensemble suivant

 base.Configuration.ProxyCreationEnabled = false; base.Configuration.LazyLoadingEnabled = false; 

Vous pouvez définir ObjectContext.ContextOptions.ProxyCreationEnabled sur false. Cela vous évitera d’utiliser certaines des fonctionnalités les plus sophistiquées des FE, telles que le chargement différé et, je crois, le suivi des modifications.

En ce qui concerne votre application, elle devrait pouvoir traiter les mandataires de la même manière que les types qu’ils représentent. Avez-vous un problème spécifique?

modifier

Nous avons du code qui requirejs le type POCO au lieu du type proxy et nous procédons comme suit pour détecter si le type actuel est un proxy.

 if (entityType.BaseType != null && entityType.Namespace == "System.Data.Entity.DynamicProxies") { entityType = entityType.BaseType; } 

Pour désactiver la création de proxy dans Entity Framework 5, vous pouvez utiliser les éléments suivants:

 _dbContext.Configuration.ProxyCreationEnabled = false; 

Il suffit de définir cette propriété une fois avant d’utiliser le contexte pour extraire des données.

Par défaut, EF utilise Change Tracking et utilise un cache en mémoire de toutes les entités. Vous pouvez utiliser différentes options de fusion lorsque vous utilisez EF. Par défaut, EF 4.1 est défini sur Option de fusion AppendOnly. Si j’ai bien compris, cela signifie que si vous avez déjà interrogé une entité, les requêtes suivantes extrairont l’entité du cache (s’il n’y a aucune modification détectée dans la firebase database). Donc, vous pouvez voir l’entité en cache revenir.

Dans EF 4.1, vous pouvez utiliser l’option NoTracking Merge. Cela ira à la firebase database pour chaque appel.

Dans EF 6.1.3, vous pouvez obtenir le bon type en utilisant

 using (var context = new BloggingContext()) { var blog = context.Blogs.Find(1); var entityType = ObjectContext.GetObjectType(blog.GetType()); } 

Notez que si le type transmis à GetObjectType est une instance d’un type d’entité qui n’est pas un type de proxy, le type d’entité est toujours renvoyé. Cela signifie que vous pouvez toujours utiliser cette méthode pour obtenir le type d’entité réel sans autre vérification pour savoir si le type est un type de proxy ou non.

À partir de MSDN