Entity Framework est un mappeur objet/relationnel qui permet aux développeurs .NET d'utiliser des données relationnelles à l'aide d'objets spécifiques au domaine. Il rend inutile la plupart du code d'accès aux données que les développeurs doivent généralement écrire. Je joue avec ça depuis deux ou trois ans, et voici mes techniques préférées:

 

1. Prolongement de la valeur TimeOut
Lors du chargement de grandes quantités de données, il peut arriver que certaines opérations échouent chaque fois qu'elles atteignent le temps mort par défaut, du coup ça pourrait être une bonne idée d'étendre cette durée à quelques heures. C'est bien de le faire pendant l'initialisation de l'objet Contexte, donc avant tout appel de base de données.

 

2. Cache de deuxième niveau
C'est la mise en cache des résultats de la requête. Les résultats de commandes SQL sont stockés dans le cache, de sorte que les commandes répétées récupèrent leurs données à partir du cache au lieu d'exécuter la requête à nouveau contre la base de données. Ceci peut présenter un gain de performances pour l'application et moins d'activités au niveau de la base de données. Pour activer cette fonctionnalité, tu peux télécharger et utiliser ce projet open source.

 

3. Code First dynamique et migration de bases de données
EF permet de programmer contre un modèle sans avoir à toucher la base de données. Avec la technique Code-First, tu peux te concentrer sur la conception des modèles et commencer à créer des classes. Les APIs de Code-First vont créer et/ou mettre à jour la base de données à la volée en fonction de tes classes d'entités et de ta configuration.
D'ailleurs, pendant qu'on parle de configuration, tu peux faire tout ça depuis ton code C#. Voici quelques propriétés pratiques:
AutomaticMigrationEnabled : pour activer la magie de Code-First
AutomaticMigrationDataLossAllowed : Une valeur indiquant si la perte de données est acceptable lors de la migration automatique. Si la valeur est "false", une exception sera levée quand la migration automatique est susceptible de créer une perte de données.

 

4. Aperçu et anticipation des changements de Code-First
Ceci est un moyen facile de générer les scripts SQL que EF compte exécuter, sans confirmer ou avant de confirmer ses changements. Voici comment ça marche:
var configuration = new MigrationConfiguration();
var migrator = new DbMigrator(configuration);
var scriptor = new MigratorScriptingDecorator(migrator);
string script = scriptor.ScriptUpdate(null, null);
Ça peut être utile si tu veux faire des changements au script qui va être exécuter, ou si tu es en train de déboguer un problème ou simplement si tu es curieux de savoir ce qui se passe :-)

 

5. MARS
Multiple Active Result Sets (MARS) est une fonctionnalité qui permet l'exécution de plusieurs paquets sur une seule connexion. Pour le dire d'une manière simple, tu peux établir une connexion au serveur, puis soumettre plusieurs commandes au serveur en même temps, puis lire les résultats de ces demandes de la manière que tu veux. Il suffit d'inclure "MultipleActiveResultSets = true" dans ta ConnectionString.

 

6. Réglage de toutes les propriétés en un seul endroit
Par exemple, au lieu d'ajouter un attribut à chaque propriété String, tu peux définir une longueur maximale par défaut comme suit:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Properties<
String>().Configure(p => p.HasMaxLength(360));
}

 

7. Stratégie d'héritage
EF a plusieurs façons de gérer l'héritage
-Table par Hiérarchie : une seule table avec toutes les propriétés des classes de base et des classes dérivées (Une propriété discriminatrice étant utilisée pour les différencier)
-Table par Type : les propriétés de base dans la table de base, et pour chaque classe dérivée, les propriétés dérivées dans une table séparée
-Table Par type concret : chaque classe dérivée obtient sa propre table avec toutes les propriétés (base ou dérivées).
C'est assez complet, le seul cas où je ne suis pas sûr: y a-t-il un moyen de faire en sorte que EF évite complètement l'héritage ? Je veux dire, en supposant que A dérive de B, est-il possible de faire en sorte que EF traite A et B comme des classes complètement différentes et ignorer le fait que l'une hérite de l'autre ?
Pas un scénario très commun, mais juste pour éviter la duplication, ce serait alors possible d'utiliser l'héritage dans le code C# sans copier les propriétés deux fois dans des classes différentes, sans réaction de la part EF. TPC se rapproche de cela, mais les classes partagent toujours la même clé primaire.

 

8. Les Méthodes EntityFunctions
Lorsqu'on utilise LINQ to Entity Framework, tes prédicats dans la proposition Where sont traduits en SQL, mais SQL n'a pas d'équivalent pour certaines constructions complexes telles que DateTime.AddDays(). C'est là que les méthodes EntityFunctions entrent en jeu.

 

9. LINQKit
LINQKit est un ensemble gratuit d'extensions pour LINQ to SQL et Entity Framework. Je l'utilise surtout pour construire dynamiquement des prédicats et insérer des variables d'expression dans les sous-requêtes, mais il permet aussi de:
- Combiner des expressions (permettre à une expression d'en appeler une autre)
- Insérer des expressions dans les EntitySets et EntityCollections
- Créer tes propres extensions

 

10. Lazy Loading
L'une des fonctionnalités les plus intéressantes de Entity Framework, c'est la fonction Lazy Loading. C'est le processus par lequel une entité ou une collection d'entités sont automatiquement chargés à partir de la base de données la première fois qu'une propriété faisant référence à l'entité ou aux entités est accessible.
Pour le dire plus simplement, Lazy Loading signifie: retarder le chargement des données, jusqu'à ce que tu les appelles explicitement.
Ceci pourrait être activé en activant la propriété Configuration.LazyLoadingEnabled.

 

11. AsNoTracking
Entity Framework expose un certain nombre d'options d'optimisation des performances pour t'aider à peaufiner tes applications. L'une de ces options de réglage est .AsNoTracking(). Cette optimisation te permet de dire à Entity Framework de ne pas traquer les résultats d'une requête. Cela signifie que Entity Framework n'effectue aucun traitement supplémentaire ou stockage des entités qui sont retournés par la requête.
Il y a des gains de performance considérables découlant de l'utilisation de AsNoTracking().

 

12. Rester loin de pièges de performance et autres complications de EF

Le gestionnaire de contexte d'objets peut parfois mener à des situations où EF se comporte de manière étrange. C'est bien d'être informé des méthodes que tu peux suivre pour éviter ces pièges.