Gestion de la durée de vie d'EntityConnection

.net asp.net c# entityconnection entity-framework

Question

Il y a eu beaucoup de questions sur la gestion de la durée de vie EntityContext ,

Par exemple, instancier un contexte dans LINQ aux entités

Je suis parvenu à la conclusion que le contexte de l'entité devrait être considéré comme une unité de travail et ne devrait donc pas être réutilisé. Génial.

Mais tout en faisant des recherches pour accélérer l’accès à ma base de données, j’ai rencontré ce blog…

Améliorer les performances du framework d'entité

L'article écrit que les performances médiocres des EF par rapport aux autres frameworks sont souvent dues à la création de l' objet EntityConnection chaque fois qu'un nouvel objet EntityContext est nécessaire.

Pour tester cela, j'ai créé manuellement un EntityConnection statique dans Global.asax.cs Application_Start ().

J'ai ensuite converti tout mon contexte à l' aide d' instructions en

using( MyObjContext currContext = new MyObjeContext(globalStaticEFConnection)
{
   ....
}

Autant que je sache, cela semble avoir accéléré un peu les choses.

Mais est-ce sécuritaire?

L'utilisation d'une entité EntityConnection statique au niveau de l'application introduit-elle des conditions de concurrence ?

Cordialement, Kervin

Réponse acceptée

EntityConnection est documenté pour ne pas être thread-safe . Je pense que vous pouvez les regrouper, mais vous ne pouvez pas utiliser une seule connexion statique pour une application Web, car de nombreux threads seront impliqués.


Réponse populaire

  • Si votre contexte EF est à l'échelle de l'application, considérez que l'utilisateur A a apporté des modifications (non validées) et que l'utilisateur B a validé ses modifications, toutes les modifications seront validées dans la base de données car les deux utilisateurs A et B utilisent la même instance.

  • Dans mon projet, j’ai réalisé une analyse par WebRequest du contexte EF - c’est-à-dire. un objet de contexte est statique du début à la fin d'une requête Web et toutes les opérations de cette requête fonctionnent dans le même contexte EF. Cela a considérablement accéléré mon traitement sans le problème mentionné ci-dessus.

Une solution consiste à utiliser un conteneur DI (j'utilise Unity) pour gérer la durée de vie du contexte EF. Le gestionnaire à vie des requêtes Web n'est pas fourni dans Unity, mais il existe une multitude d'articles qui montrent comment cela peut être fait.

HTH.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow