Dois-je activer ou désactiver des proxies dynamiques avec entity framework 4.1 et MVC3?
Quelqu'un pourrait offrir quelques conseils ou quelques blogs/articles qui pourraient vous aider dans la prise de cette décision? Les procurations semblent très étranger à moi et j'hésite à les utiliser. J'aime la capacité de contrôler le Chargement Paresseux en utilisant les propriétés virtuelles dans mon modèle, mais c'est à peu près tous les avantages que je peux voir. Mon application est une simple application web MVC et je n'ai pas besoin de câbler tout crochets dans le contexte de lorsque les entités de l'expérience d'un état modifié.
De toute façon, voici ma liste restreinte des avantages et des inconvénients dès maintenant, laissez-moi savoir si je suis hors de la base à tout cela.
Pros
- Sur "Enregistrer" ou "mise à Jour", j'obtiens tout en douceur avec "Appliquer'Changes'
- Paresseux-Chargement de la configuration est très facile.
Contre
- Jamais les proxys utilisés avant pour mes entités, c'est un changement dans
l'approche qui semble mal à l'aise pour moi et les collègues de l'équipe
les membres de l'. - Difficile à déboguer.
- Nécessite un code supplémentaire si je veux sérialiser/désérialiser
- Sur "Enregistrer" ou "mise à Jour", la procuration doit être le même objet qui a été récupéré à partir du contexte.
- +1 - La sérialisation / désérialisation des questions de douleur!
Vous devez vous connecter pour publier un commentaire.
Si vous parlez de proxies dynamiques en EF il y a deux différents types de distinguer:
Généralement un suivi des modifications proxy peut aussi servir comme un proxy pour le chargement paresseux. L'inverse n'est pas vrai. Ce est parce que les exigences pour la modification de suivi procurations sont plus élevés, en particulier tous propriétés - aussi les propriétés scalaires doivent être
virtual
. Pour le chargement paresseux il suffit que les propriétés de navigation sontvirtual
.Le fait qu'un suivi des modifications proxy toujours permet également de tirer parti de lazy loading est la raison principale pourquoi la DbContext a cette configuration drapeau:
Ce drapeau est le cas par défaut. Le paramètre
false
désactive le chargement paresseux, même si les proxies sont créés. Ceci est particulièrement important si vous travaillez avec le suivi des modifications des proxys, mais ne voulez pas utiliser ces procurations pour le chargement paresseux ainsi.L'option ...
... désactive la création de proxy complètement - pour le suivi des modifications et de chargement paresseux ainsi.
Les deux drapeaux ont seulement un sens à tous si vos classes d'entités respectent les exigences de la création, soit le suivi des modifications ou le chargement différé des procurations.
Maintenant, vous savez le but de la dynamique de chargement différé des procurations. Alors, pourquoi devrait-on utiliser la modification dynamique de suivi des procurations?
En fait la seule raison pour laquelle je suis conscient de est performance. Mais c'est une très bonne raison. La comparaison de l'instantané de base de suivi des modifications avec proxy en fonction de suivi des modifications de la différence de performance est énorme, de mes mesures un facteur de 50 à 100 est réaliste (prises à partir d'une méthode qui a besoin d'environ une heure pour 10000 entités avec l'instantané en fonction de suivi des modifications et de 30 à 60 secondes après la prise de toutes les propriétés virtuel pour activer le suivi des modifications des procurations). Cela devient un facteur important si vous avez une application qui des processus et des changements beaucoup (disons plus de 1000 entités. Dans une application web où vous peut-être seulement de Créer/Modifier/Supprimer des opérations sur des entités uniques dans une requête web, cette différence n'est pas tellement d'importance.
Dans presque toutes les situations, vous pouvez tirer parti de la hâte ou explicite de chargement pour atteindre le même but, si vous ne voulez pas travailler avec un chargement différé des procurations. La performance de proxy d'après le chargement paresseux ou non-proxy en fonction explicite de chargement est le même parce que, fondamentalement, la même requête qui arrive quand les propriétés de navigation sont chargés dans le premier cas, le proxy ne la requête, dans le second cas, votre code. Ainsi, vous pouvez vivre sans chargement différé des procurations sans perdre pour autant.
Mais si vous voulez de rendement raisonnables pour traiter de nombreuses, de nombreuses entités, il n'y a pas d'alternative à la modification de suivi des procurations - part en utilisant
EntityObject
dérivés des entités à EF 4.0 (pas une option en EF 4.1 parce que c'est interdit, lorsque vous utilisezDbContext
) ou non à l'aide de Entity Framework à tous.Édition (Mai 2012)
En attendant, j'ai appris qu'il existe des situations où le suivi des modifications des procurations ne sont pas plus rapide ou même pire de performance par rapport à l'instantané de base de suivi.
En raison de ces complications lors de l'utilisation de la modification de suivi des procurations, la préférence est d'utiliser instantané en fonction de suivi des modifications par défaut et utiliser le proxy avec soin (après avoir fait quelques tests) que dans les situations où la haute performance est requise et où ils s'avèrent être plus rapide que l'instantané en fonction de suivi des modifications.
if (DisableProxy) { context.Configuration.ProxyCreationEnabled = false; context.Configuration.LazyLoadingEnabled = false; }
j'ai été en mesure de permettre à ces proxies dynamiques être disponible pour être sérialisé, sans causer de référence circulaire erreurs. Merci! +1Pour toute personne utilisant Entity Framework 5, assurez-vous de vérifier la Facteurs De Performance article.
Sections 5 NoTracking Queries
et8 Loading Related Entities
offre les informations dont vous avez besoin pour prendre une décision éclairée. Des acclamations.Je suggère de ne PAS utiliser les proxy. Dynamique de la création de proxy pauses ou crée des complications pour les composants qui sont dépendants de l'exécution de vérification de type.
Automapper, par exemple, va lancer une incompatibilité de type /type inattendu d'erreur lors de l'exécution de votre entités ont généré dynamiquement les types de proxy lors de l'exécution, et non les types que vous avez passé dans lors de la configuration de mappant automatiquement.
Bien que des proxies dynamiques ont quelques fonctionnalités sympas, en réalité, ils peuvent créer beaucoup de étrange et obscur de bugs.
Par exemple un gardé une variable privée d'une entité dans une de mes classes (c'était la mise en œuvre d'un processus de traitement par lots) et j'ai été en parcourant quelques-uns des millions de documents, de traitement et de l'insertion par lots, en recréant le contexte de données, tous les n-dossiers à nettoyer la mémoire. Bien que je n'ai JAMAIS utilisé la variable privée, EF a été le reliant à mes nouveaux objets (il y avait une référence à travers une propriété de navigation), même si j'étais seul paramètre l'Id de référence.
Cela a causé tous les objets restent en mémoire pendant toute la durée de la procédure était en cours d'exécution. J'ai eu à utiliser AsNoTracking et désactiver les procurations pour que le processus fonctionne comme prévu et de la mémoire et de la performance de retourner à la normale. Gardez à l'esprit que les procurations aussi faire référence au contexte qui les a créés et ce peut garder en mémoire énorme de graphiques d'entités, il est presque impossible de le déboguer
Donc, je crois que vous devriez désactiver globalement les procurations et les activer dans les petites et contenait des morceaux de code. Il est très dangereux et impossible de débogage de telles questions, spécialement quand vous avez de grandes équipes de codage.
Le suivi des modifications est gentil, il pourrait justifier l'utilisation dans certains endroits.
Le chargement différé peut être un énorme problème de la performance et de la sérialisation, sauf si vous savez ce que vous faites. Je préfère désireux ou le chargement explicite à tout moment.
Utilisation Automapper 4.2.1. La nouvelle version est de ne pas avoir DynamicMap