2008-12-16 7 views
9

J'utilise ADO.NET EF dans une application MVC. J'envisage de placer le ObjectContext dans HttpContext.Current de sorte que toute la logique de la même requête puisse y accéder sans devoir ouvrir/détruire à chaque fois. Cependant, je suis vraiment sûr que c'est un bon moyen de gérer les instances ObjectContext. J'ai 2 questions concernant ce besoin:Gérer ADO.NET Entity Framework ObjectContext dans ASP.NET MVC

  1. Comme HttpContext.Current propriété est soutenu par un champ de thread local et ASP.NET utilise des threads de la piscine pour traiter les demandes, est-il possible qu'une instance ObjectContext mise en HttpContext .Current par une demande sera visible à une demande ultérieure s'exécutant sur le même thread à partir du pool? Comment pensez-vous que ObjectContext doit être géré dans ASP.NET MVC pour éviter les problèmes d'ouverture et d'élimination?

Répondre

1

Je suis d'accord avec Todd - utilisation DI/IoC cotnainer (Unity, Windsor) avec par-fil (ou sur mesure per- demande) durée de vie. Si je me souviens bien, dans Linq to SQL, l'objet DataContext était considéré comme un objet léger, donc il ne devrait pas être difficile de le créer souvent. J'espère que c'est similaire pour EF.

2

J'utiliser un conteneur IoC comme StructureMap, Autofac, Windosor, etc.

5

Utilisez le Repository pattern. Override Controller.Dispose pour disposer du référentiel, qui, à son tour, dispose du DataContext.

0

Merci pour la suggestion de l'IoC. J'ai utilisé Unity et implémenté un gestionnaire de durée de vie par requête pour stocker/récupérer des objets via HttpContext.Current. Ça semble fonctionner correctement. L'utilisation d'un seul ObjectContext par requête est une bonne idée.

+0

Pourriez-vous éventuellement poster du code pour montrer comment vous avez ajouté un objet à HttpContext.Current? L'avez-vous ajouté à la collection Items, ou ...? – Cynthia

+0

Ceci est le code dans le gestionnaire de durée de vie Unity personnalisé: HttpContext.Current.Items [key] = newValue –

2

Si vous le manipulez vous-même, vous devez placer le contexte dans la collection HttpContext.Items. Sur EndRequest, vous devez vous assurer que le contexte est éliminé. Comme mentionné précédemment, certains frameworks IoC prennent en charge cette OTB, généralement appelée portée/durée de vie PerRequest.

Questions connexes