Meilleures pratiques pour améliorer les performances d'Entity Framework

Entity Framework de Microsoft est un ORM étendu qui vous aide à isoler le modèle objet de votre application du modèle de données. Il s'agit d'un framework ORM open source pour ADO.Net et est inclus dans le cadre de .Net Framework. Dans cet article, je présenterai quelques conseils à suivre pour optimiser les performances d'Entity Framework. Dans les sections qui suivent, j'examinerai quelques conseils qui peuvent être adoptés pour améliorer les performances des applications lorsque vous travaillez avec Entity Framework.

Votre modèle de données d'entité représente-t-il une seule unité de travail?

Lorsque vous créez votre EDM (Entity Data Model), vous devez vous assurer que l'EDM représente une seule unité de travail et non la base de données entière, en particulier lorsque vous avez de nombreux objets (tables, procédures stockées, vues, etc.) dans votre base de données qui sont déconnectés ou ne sont pas nécessaires pour une unité de travail particulière. Si votre EDM représente la base de données entière quand il n'est pas nécessaire, il peut dégrader les performances de l'application en raison de la nécessité de charger de nombreux objets inutiles dans la mémoire. En substance, vous devez diviser un grand modèle de données d'entité en modèles plus petits, chaque modèle représentant une unité de travail.

Vous pouvez consulter cet article MSDN pour plus d'informations sur la façon dont les performances d'Entity Framework peuvent être améliorées.

Désactiver le suivi des modifications

Vous devez désactiver le suivi des modifications s'il n'est pas nécessaire. Plus important encore, vous n'avez pas besoin de suivi des modifications lorsque vous souhaitez simplement récupérer des données et que des mises à jour sur les données lues ne sont pas du tout nécessaires. Vous pouvez utiliser l'instruction suivante pour désactiver le suivi des modifications ou mettre en cache le résultat d'une requête lorsque vous souhaitez récupérer des clients de la base de données sans qu'il soit nécessaire de mettre à jour les enregistrements.

Si vous souhaitez désactiver le suivi des objets pour la table Clients, vous pouvez utiliser le code suivant.

PayrollContext context = new PayrollContext();

Réduisez le coût de la génération de vues grâce aux vues pré-générées

La création d'ObjectContext est une opération coûteuse car elle implique le coût de chargement et de validation des métadonnées. Vous devez tirer parti des vues pré-générées pour réduire le temps de réponse lorsque la première requête est exécutée. En substance, l'environnement d'exécution Entity Framework crée un ensemble de classes (également appelé la vue) lorsque le contexte de l'objet est instancié pour la première fois. Vous pouvez réduire cette surcharge en générant au préalable la vue du fichier EDMX à l'aide de l'outil de ligne de commande EdmGen.exe ou des modèles T4. Notez que si les fichiers de schéma du modèle ont changé, vous devez régénérer le fichier de vues en exécutant EdmGen.exe avec l'indicateur / mode: ViewGeneration. Vous pouvez également pré-générer des vues avec un premier modèle de code.

Désactiver la détection automatique des modifications

Lors de la tentative de mise à jour de la base de données, Entity Framework a besoin de connaître les modifications qui ont été apportées à une entité depuis le moment où elle a été chargée en mémoire. Cette détection de changement est effectuée en comparant les anciennes valeurs des propriétés avec les valeurs nouvelles ou modifiées lorsque vous appelez les méthodes comme, Find (), Remove (), Add (), Attach () et SaveChanges (). Cette détection de changement est très coûteuse et peut dégrader les performances de l'application principalement lorsque vous travaillez avec de nombreuses entités. Vous pouvez désactiver la détection des modifications à l'aide du code suivant.

Lorsque vous souhaitez désactiver la détection des modifications, il est recommandé de la désactiver dans un bloc try / catch, puis de la réactiver à l'intérieur du bloc finally. Notez que vous pouvez ignorer cela lorsque vous travaillez avec un ensemble de données relativement petit - vous obtiendrez des gains de performances significatifs en désactivant la détection des modifications lorsque vous travaillez avec un grand ensemble de données.

Autres points à garder à l'esprit

Utilisez des projections pour sélectionner uniquement les champs nécessaires lors de la récupération des données. Vous devez éviter de récupérer des champs qui ne sont pas nécessaires.

L'extrait de code suivant illustre comment vous pouvez utiliser la récupération des données de manière paginée - notez comment l'index de la page de départ et la taille de la page ont été utilisés pour sélectionner uniquement les données nécessaires.

int pageSize = 25, startingPageIndex = 1;

NorthwindEntities dataContext = new NorthwindEntities();

List lstCus = dataContext.tblCustomers.Take(pageSize)

.Skip(startingPageIndex * pageSize)

.ToList();

Vous devez également sélectionner la collection appropriée et utiliser des requêtes compilées pour améliorer les performances de vos requêtes LINQ lors de la récupération des données exposées par EDM. Évitez d'extraire tous les objets de base de données dans un modèle de données d'entité. Récupérez uniquement le nombre d'enregistrements nécessaires et évitez d'utiliser "Contient" lorsque vous utilisez LINQ to Entities. Vous pouvez utiliser la pagination pour récupérer uniquement les données demandées ou restreindre la quantité de données extraites de la base de données. En outre, vous devez ajouter des index à vos entités en appelant la méthode CreateIndex ().

Vous pouvez en savoir plus sur les considérations de performances lors de l'utilisation d'Entity Framework à partir de ce lien.