2010-11-02 5 views
-1

J'utilise le code bootstrapping StructureMap suivant pour mon Entity Framework 4 entités:cadre de l'entité StructureMap 4 connexion

x.For<XEntities>().LifecycleIs(Lifecycles.GetLifecycle(InstanceScope.PerRequest)).Use(() => new XEntities()); 

Mais quand je fais deux demandes presque simultanées, je reçois l'exception suivante:

EntityException:The underlying provider failed on Open. 
{"The connection was not closed. The connection's current state is connecting."} 

J'utilise ASP.NET MVC 2, et j'ai ce qui suit dans mon Application_Start() EndRequest + = new EventHandler (MvcApplication_EndRequest);

void MvcApplication_EndRequest(object sender, EventArgs e) 
{ 
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); 
} 

Que puis-je faire pour résoudre ce problème?

[edit] cela se passe sur une page avec plusieurs images dessus. Les images proviennent de la base de données, servies par une action du contrôleur, qui lit l'image de la base de données et l'envoie en tant que résultat de fichier au navigateur. Je pense qu'asp.net décompose mon objectcontext, et ferme ma connexion db quand les demandes d'images arrivent, et l'exception est levée. Ce dont j'ai besoin maintenant, c'est une façon correcte de gérer la vie du contexte de l'objet dans le bon sens. Pourquoi attribuez-vous un délégué pour EndRequest dans Application_Start()?

+0

Vous ne voulez certainement pas appeler quoi que ce soit sur ObjectFactory dans l'événement EndRequest. ObjectFactory est statique, ce qui signifie qu'il s'agit du même objet utilisé pour toutes vos demandes. Vous pourriez appeler ReleaseAndDispose sur une requête en cours de traitement. –

+0

Qu'est-ce que XEntities? Est-ce l'objet qui gère votre connexion à la base de données? –

+0

Vous ne voulez probablement pas le cycle de vie InstanceScope.PerRequest, puisqu'il s'agit de la valeur par défaut (où request = un appel au conteneur). Je suppose que vous voulez dire "donnez-moi le même objet tout au long d'une requête HTTP". Si tel est le cas, regardez les cycles de vie HTTP, comme le suggère RPM1984 ci-dessous. –

Répondre

2

Pourquoi?

crochet Juste directement dans l'événement:

protected void Application_EndRequest() 
{ 
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); 
} 

De plus, je n'ai jamais utilisé cette syntaxe avant, voici comment je le fais:

For<XEntities>().HybridHttpOrThreadLocalScoped().Use<XEntities>() 

De plus, à quel moment avez-vous new up votre contexte de données? Pouvez-vous montrer du code?

+0

J'ai essayé votre approche x.Pour () .HybridHttpOrThreadLocalScoped(). Utilisez (new XEntities()) C'est ainsi que je crée mon contexte de données. J'ai directement ajouté endRequest à l'événement, et j'ai obtenu l'exception suivante: L'instance ObjectContext a été supprimée et ne peut plus être utilisée pour les opérations nécessitant une connexion. – jwdehaan

+0

@jwdehaan - Où utilisez-vous le contexte de données? dans vos contrôleurs? via un référentiel? peux-tu montrer du code? – RPM1984