Da ich neu im Entity Framework bin, bin ich eher daran interessiert, wie ich mit dieser Reihe von Problemen fortfahren kann. Bei dem Projekt, an dem ich gerade arbeite, ist die gesamte Website stark in das EF-Modell integriert. Der Zugriff auf den EF-Kontext wurde zunächst mit einem Bootstrapper Dependency Injection gesteuert. Aus betrieblichen Gründen konnten wir keine DI-Bibliothek verwenden. Ich entfernte das und verwendete ein Modell einzelner Instanzen des Kontextobjekts, wo dies erforderlich war. Ich habe die folgende Ausnahme erhalten:.NET Entity Framework und Transaktionen
Der Typ 'XXX' wurde mehr als einmal zugeordnet.
Wir kamen zu dem Schluss, dass die verschiedenen Instanzen des Kontexts dieses Problem verursachten. Ich abstrahierte dann das Kontextobjekt in eine einzelne statische Instanz, auf die von jedem Thread/jeder Seite zugegriffen wurde. Ich bekomme jetzt eine von mehreren Ausnahmen über Transaktionen:
Neue Transaktion ist nicht zulässig, da andere Threads in der Sitzung ausgeführt werden.
Der Transaktionsvorgang kann nicht ausgeführt werden, da ausstehende Anforderungen an dieser Transaktion ausgeführt werden.
ExecuteReader erfordert, dass der Befehl eine Transaktion ausführt, wenn die dem Befehl zugewiesene -Verbindung in einer ausstehenden lokalen Transaktion ist. Die Transaction-Eigenschaft des Befehls wurde nicht initialisiert.
Die letzte dieser Ausnahmen trat bei einer Ladeoperation auf. Ich habe nicht versucht, den Kontextzustand in dem DB in dem fehlgeschlagenen Thread zu speichern. Es gab jedoch einen anderen Thread, der eine solche Operation ausführte.
Diese Ausnahmen sind bestenfalls intermittierend, aber es ist mir gelungen, die Site in einen Status zu versetzen, in dem neue Verbindungen aufgrund einer Transaktionssperre abgelehnt wurden. Leider kann ich die Ausnahmedetails nicht finden.
Ich denke, meine erste Frage ist, sollte das EF-Modell aus einer statischen Einzelinstanz verwendet werden? Ist es auch möglich, die Notwendigkeit von Transaktionen in EF zu entfernen? Ich habe versucht, ohne Erfolg ein TransactionScope
Objekt mit ...
Um ehrlich zu sein habe ich viel bin hier fest und kann nicht verstehen, warum (was sein soll) ziemlich einfache Operationen, wie ein Problem verursachen ...
Verbunden: http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why – Steven
Es ist schade, dass Sie nicht einen IOC Bootstrapper verwenden können, weil die Lösung mit [Ninject] (http wäre eine "gemeinsame" Instanz an die _request scope_ zu binden //www.ninject.org/), wie andere vorgeschlagen haben:. 'kernel.Bind>(), um > () .InRequestScope(); '- der wichtige Teil **' InRequestScope' ** –
drzaus