web-dev-qa-db-fra.com

Puis-je créer un objet Entity Framework DataContext et le disposer dans un bloc using dans chacune de mes méthodes CRUD?

Je crée une application wpf qui implémente les fonctionnalités suivantes:

  1. Prendre les entrées des utilisateurs et lire les données des bases de données
  2. effectuer des calculs dessus
  3. Présentez-le à l'utilisateur dans plusieurs types de vues et réécrivez les modifications dans db

Architecture proposée: Base de données -> Entity Framework -> Repository -> Business Logic -> Data Service -> ViewModel

Raisons d'utiliser cette architecture: plusieurs scénarios présents dans l'application (plusieurs vues) et plusieurs bases de données. Par conséquent, je suis prêt à utiliser le référentiel au milieu pour l'abstraction.

Une mise en garde est que le contexte sera de longue durée si le référentiel est implémenté. Pour surmonter cela, est-il correct de créer un contexte et de les disposer dans un bloc using () dans chacune des méthodes crud.?

n'hésitez pas à suggérer des approches alternatives.

10
Skyuppercut

Utilisez un objet DbContext par accès aux données ou transaction.

DbContext est un objet léger; il est conçu pour être utilisé une fois par transaction commerciale. Faire de votre DbContext un singleton et le réutiliser dans l'application peut entraîner d'autres problèmes, comme des problèmes de simultanéité et de fuite de mémoire.

DbContext implémente essentiellement une Unité de travail. Traitez-la en conséquence.

Ne supprimez pas les objets DbContext.

Bien que DbContext implémente IDisposable, vous ne devez pas le supprimer manuellement, ni l'envelopper dans une instruction using. DbContext gère sa propre durée de vie; lorsque votre demande d'accès aux données est terminée, DbContext ferme automatiquement la connexion à la base de données pour vous.

Pour comprendre pourquoi c'est le cas, considérez ce qui se passe lorsque vous exécutez une instruction Linq sur une collection d'entités à partir d'un DbContext. Si vous renvoyez un IQueryable à chargement différé à partir de votre méthode d'accès aux données, vous mettez en place un pipeline qui n'est pas réellement exécuté tant que le client n'en a pas forcé certaines données (en appelant FirstOrDefault(), ToList() ou itérer dessus).

Lectures complémentaires
Dois-je toujours appeler Dispose () sur mes objets DbContext?
Pourquoi vous ne devriez pas utiliser Singleton DataContexts dans Entity Framework
renvoyant IEnumerable<T> contre. IQueryable<T>
Les référentiels doivent-ils renvoyer IQueryable?

15
Robert Harvey