Laden...

[erledigt] Eine Entity kann nicht von 2 EntityChangeTrackern verfolgt werden

Erstellt von ErikM vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.652 Views
E
ErikM Themenstarter:in
39 Beiträge seit 2011
vor 10 Jahren
[erledigt] Eine Entity kann nicht von 2 EntityChangeTrackern verfolgt werden

verwendetes Datenbanksystem: MSSQL Server 2008 R2

Hallöchen,

ich habe in meiner Anwendung ein generisches UnitofWork und diverse Repositories.

diese benutze ich so:



using (IUnitOfWork unitofwork = new UnitOfWork()) 
using (IRepository<Product> productRepository = new Repository<Product()) {

//hier passiert irgendwas

unitofwork.SaveChanges();

}


Die Klasse unitofwork legt auch den s.g. DbContext an, der nach dem Verlassen und disposen des UnitofWork-Blocks auch disposed wird.

Problem : Scheinbar wird der DbContext nicht vernünftig mitentsorgt, sodass beim späteren Versuch ein Attach(T Entitfy) durchzuführen fehlschlägt..

Fehlermeldung ist dann sinngemäß : > Fehlermeldung:

"Eine Entity kann nicht von 2 EntityChangeTrackern verfolgt werden" 😮

Woran mag das liegen ?

Mit freundlichen Grüßen

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo ErikM,

das liegt wohl an der Proxy-Generierung und höchstwahrscheinlich hält das Proxy eine Referenz auf den DbContext, der die Entität geladen hat. Daher der Fehler und das nicht "korrekte" entsorgen des 1. DbContext (die " deshalb, da es dennoch korrekt ist, falls die Annahme mit der Referenz vom Proxy aus stimmt).

Schalte mal die Proxy-Erzeugung aus.


_db.Configuration.ProxyCreationEnabled = false;

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

E
ErikM Themenstarter:in
39 Beiträge seit 2011
vor 10 Jahren

Das mit dem Proxy brachte leider keinen Erfolg 😦

Ich habe mal in einem Testprogramm folgendes Szenario nachgebaut.. dort funktioniert das 😮..


            Lot a;
            using (Entities context = new Entities())
            {
                 a = context.Lot.First();
            }

            using (Entities context = new Entities())
            {
                context.Lot.Attach(a);
                a.CurrentAmount = 1000;
                
                context.SaveChanges();
            }

alles sehr merkwürdig 😦

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo ErikM,

wenns hier geht und im anderen Projekt nicht, kannst du versuchen systematisch die Ursache zu finden. Einen Leitfaden zu dieser Vorgehensweise findest du z.B. in [Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden.

Hast du im anderen Projekt vllt. Referenzen zu anderen Entitäten (die dann noch auf den alten Context zeigen)?

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

E
ErikM Themenstarter:in
39 Beiträge seit 2011
vor 10 Jahren

Joa.. o__o,

ich füllte mit den empfangenen Objekten ein IEnumerable<T> und das ist vermutlich verkehrt 😮.. denn die zeigen ja tatsächlich noch auf den DbContext.. 😦

E
ErikM Themenstarter:in
39 Beiträge seit 2011
vor 10 Jahren

Hast du im anderen Projekt vllt. Referenzen zu anderen Entitäten (die dann noch auf den alten Context zeigen)?

Also es ist jetzt so, dass alle empfangenen Objekte in Listen gepackt werden..

Im Repository steht



_context.Set<T>().AsQueryable();


später ruft ein Controller drauf "ToList()" auf..

Wie kriege ich das hin, dass keine Referenzen mehr den alten DbContext benutzen ?

Ich stehe hart auf dem Schlauch 😮

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo ErikM,

du kannst beim Laden AsNoTracking angeben, dann werden sie erst gar nicht dem Context hinzugefügt.

Ich kann das Problem nicht reproduzieren. Kannst du ein ganz einfaches Beispiel zeigen (ggf. anhängen) indem das Problem reproduzierbar ist?

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

E
ErikM Themenstarter:in
39 Beiträge seit 2011
vor 10 Jahren

Thema hat sich erledigt..

Beim UnitOfWork wurde IDisposable nicht richtig implementiert o___o

Aber jetzt ist alles schön :3