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
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!"
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 😦
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!"
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.. 😦
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 😮
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!"
Thema hat sich erledigt..
Beim UnitOfWork wurde IDisposable nicht richtig implementiert o___o
Aber jetzt ist alles schön :3