Laden...

[erledigt] Objekt wird von mehrern IEntityChangeTrackern referenziert

7 Antworten
1,340 Aufrufe
Letzter Beitrag: vor 13 Jahren
[erledigt] Objekt wird von mehrern IEntityChangeTrackern referenziert

verwendetes Datenbanksystem: <Entity Framework 3.5>

Hi,
Auf einer Webform speichere ich gewisse Entity Objekte in verschiedenen Sessions, da die eine Seite immer wieder mal neugeladen wird.

Wenn ich dann mein Entity Objekt in der Datenbank abspeichern möchte erhalte ich die Exception > Fehlermeldung:

An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

Im Internet lese ich öfters dass dies damit zusammenhängt, dass verschiedene Objekt-Kontexe im Spiel sind.
Bei den einzelnen Objekten in den Sessions sollte dies nicht der Fall sein, weil ich sie sonst nicht miteineander referenzieren könnte.

Was kann sonst noch das Problem sein?

Gruss,
Regenwurm

ServiceStack & Angular = =)

Hi,

Du darfst / kannst **sollst **keine Entities bei einer Webwendung in die Session ablegen! Nie!

Nachdem der Request bei einer Webanwendung abgeschlossen ist, wird die Verbindung des Contexts beendet. Beim nächsten Request wird ein neuer Kontext erstellt und damit Deine Fehlermeldung ausgelöst.
Dies ist auch zwingend notwendig, da Du bei einer Webanwendung immer mit mehreren Threads arbeitest und das Entity Framework nicht Thread-sicher ist.

Lösung: Speichere nur die Pramary-Keys in der Session und hol Dir die Entities beim nächsten Request erneut aus der Datenbank. Das minimiert auch das Risikos einer Inkonsistenz.

Siehe auch [gelöst] ASP MVC + EntityFramework: Connection (closed/ opened) ==> Context Sharing

Hi Abt,

Die Objekte die in der Session abgespeichert werden, sind 'neu' -> also noch nie in der Datenbank abgespeichert.
Deswegen habe ich auch keine Primary Keys zur Verfügung.

Gruess,
Regenwurm

ServiceStack & Angular = =)

Dann stellt sich die Frage, wieso Du die Objekte in die Session legst, wenn Du sie theoretisch gar nicht brauchst.

Die Objekte brauche ich (leider).

Auf der linken Seite meiner Webform habe ich diverse Textfelder zum ausfüllen einer Lizenz.

Auf der rechten Webseite ein radGrid Control in welches man alle Instrumente einfüllt die lizenziert werden sollen.
Das RadGrid verlangt eine DataSource (schlussendlich wird auf die IQueryable<T> des benötigten Objektes aus dem Entity Framework verlinkt).
Dort gebe ich eine List<T> an. Da das GridControl jedesmal via AJAX die Seite neulädt, wird auch mein List-Objekt neugeladen. - Aus diesem Grund speichere ich diese in der Session.
Dasselbe mit den aktuellen Daten der Lizenz.

Schlussendlich wenn der Benutzer auf einen Button drückt, will ich dann beide Objekte (einmal eine Liste mit den Instrumenten & einmal die Lizenz) in die Datenbank abspeichern.
Geht aber aufgrund der oben angegeben Exception nicht.

Ich hoffe dies ist nun ein bisschen ausführlicher erklärt 😃

Gruess,
Regenwurm

ServiceStack & Angular = =)

Benutzt in diesem Fall lieber ViewModels; sprich eine weitere Klasse, die die gleichen Properties hat wie Deine Entity. Erbe aber nicht davon! Die beiden Klassen sollen / dürfen nichts voneinander wissen.

Erst beim Speichern legst Du dann eine Entity an und überträgst die Werte vom ViewModel in die eigentliche Entity.

=> Hier würde sich auch ein Repository "anbieten", das von dem ViewModel weiß und die Aufgabe der Datenübernahme von ViewModel in Model übernehmen kann; oder einfach ein ToEntityModel() im ViewModel anbiete (ja, dann kennen sich die Klassen doch - aber geerbt werden darf nicht!)

Ok, schaue ich mir in den nächsten Tagen mit Sicherheit mal an - Vielen Dank.

Ich habe das Problem temporär so gelöst dass ich das Objekt vor dem Speichern in ein neues kopiere.

Gruess,
Regenwurm

ServiceStack & Angular = =)