2011-01-04 4 views
0

Ich habe eine ASP.NET MVC-Anwendung mit LinqToSql. Die Datenebene enthält Methoden zum Ausführen von Crud-Operationen in der Datenbank. Jede Methode kann einen Datenkontext von der Strukturkarte anfordern, die so konfiguriert ist, dass sie den gleichen Datenkontext pro HTTP-Anforderung (InstanceScope.Hybrid) zurückgibt, so dass ich mehrere Methoden auf der Datenschicht aufrufen kann und am Ende submissionchanges aufgerufen wird in einer Transaktion enthalten. Bis jetzt funktioniert das gut. Ich habe auch Workflow-Aktivitäten (mit WF4), die natürlich in einem separaten Thread, dem Workflow-Thread laufen. Einige Aktivitäten führen auch Crud-Operationen mit der gleichen Datenschicht. Das Problem ist, dass die Strukturkarte (manchmal) denselben Datenkontext für verschiedene Aktivitäten zurückgibt, wahrscheinlich weil diese Aktivitäten im selben Workflow-Thread ausgeführt werden. Dies führt zu Problemen, da der Datenkontext Instanzen von Entitäten zwischenspeichern kann, die zwischen den Ausführung von zwei Aktivitäten geändert wurden (weil Daten von der Webanwendung geändert wurden).Problem mit structuremap Erstellen von linqtosql datacontext in ASP.NET von Hintergrundprozess

Eg.

Activity1

  • Anrufe Methode A auf data => Methode A Datacontext von StructureMap => anfordert Datacontext X1 zurückgegeben
  • Anrufe Methode B auf data => Methode B Anfragen Datacontext von StructureMap => Datacontext X1 zurückgegeben
  • Anrufe SubmitChanges, A und B sind verpflichtet,

Webanwendung

  • Anrufe Methode B auf data => Methode B Anfragen Datacontext von StructureMap => Datacontext X2
  • Anrufe SubmitChanges zurückgegeben wird, wird B commited

Activity 2

  • Anrufe Verfahren B auf Datenlayer => Methode B Anfrage Datenkontext von Strukturkarte => Datenkontext X1 wird zurückgegeben (=> hier würde ich einen anderen Datenkontext benötigen).

Datacontext X1 Entitätsinstanzen wird das Caching, Web Application Entity dazwischen, so dass ich changeconflict Ausnahme

Von der Webapplikation, StructureMap instancescope Hybrid ist in Ordnung, weil jede Web-Anfrage gibt mir eine andere Datacontext-Instanz geändert hat , von WF ist das nicht in Ordnung ... Ich kann Strukturkarte in WF nicht konfigurieren, um Instanz pro Anfrage zurückzugeben, weil das mir unterschiedliche Datenkontexte in Methode A und Methode B ... geben würde, also würden A und B in einer Transaktion nicht enthalten sein .

Vielleicht, wenn ich structuremap erklären könnte, um den Datenkontext zu entsorgen, wenn submitchanges aufgerufen wird, würde dies mein Problem lösen, aber ich weiß nicht, ob oder wie dies mit Strukturkarte getan werden kann.

Antwort

0

Ich glaube, was Sie möchten EjectAllInstances Methode; Dadurch wird die zwischengespeicherte Instanz des Datenkontexts gelöscht. Wenn Sie also das nächste Mal eine von StructureMap anfordern, wird sie neu erstellt.

+0

Ist das nicht gefährlich zu tun? Es kann andere Hintergrundprozesse geben, die eine andere Instanz von datacontext haben, sie werden auch ausgeworfen ... – rekna

+0

Ja, es wird dispose aufrufen, also wird das nicht funktionieren.Ich denke, was Sie wirklich brauchen, ist ein benutzerdefinierter Bereich, der sich irgendwie in WF einklinkt, so dass SM wissen kann, wann die zwischengespeicherte Instanz zu entsorgen ist. –

Verwandte Themen