Ich versuche, Mitarbeiterdetails zu speichern, die Verweise auf City enthalten. Aber jedes Mal, wenn ich versuche, meinen validierten Kontakt zu speichern, wird die Ausnahme "ADO.Net Entity Framework Ein Entitätsobjekt kann nicht von mehreren Instanzen von IEntityChangeTracker referenziert werden" angezeigt.
Ich hatte so viele Beiträge gelesen, bekam aber immer noch keine genaue Vorstellung davon, was zu tun ist ... mein Klickcode für die Schaltfläche Speichern ist unten angegeben
protected void Button1_Click(object sender, EventArgs e)
{
EmployeeService es = new EmployeeService();
CityService cs = new CityService();
DateTime dt = new DateTime(2008, 12, 12);
Payroll.Entities.Employee e1 = new Payroll.Entities.Employee();
Payroll.Entities.City city1 = cs.SelectCity(Convert.ToInt64(cmbCity.SelectedItem.Value));
e1.Name = "Archana";
e1.Title = "aaaa";
e1.BirthDate = dt;
e1.Gender = "F";
e1.HireDate = dt;
e1.MaritalStatus = "M";
e1.City = city1;
es.AddEmpoyee(e1,city1);
}
und Employeeservice Code
public string AddEmpoyee(Payroll.Entities.Employee e1, Payroll.Entities.City c1)
{
Payroll_DAO1 payrollDAO = new Payroll_DAO1();
payrollDAO.AddToEmployee(e1); //Here I am getting Error..
payrollDAO.SaveChanges();
return "SUCCESS";
}
quelle
Form
(was jedoch nur eine Arbeitseinheit darstellt) pro verwendenThread
(daDbContext
nicht garantiert wird, dass sie threadsicher sind).Die Schritte zur Reproduktion können folgendermaßen vereinfacht werden:
Code ohne Fehler:
Mit nur einem
EntityContext
kann dies gelöst werden. Weitere Lösungen finden Sie in anderen Antworten.quelle
Dies ist ein alter Thread, aber eine andere Lösung, die ich bevorzuge, besteht darin, nur die cityId zu aktualisieren und das Lochmodell City nicht dem Mitarbeiter zuzuweisen. Dazu sollte der Mitarbeiter folgendermaßen aussehen:
Dann ist es genug zuzuweisen:
quelle
Alternativ zur Injektion und noch schlimmer zu Singleton können Sie die Detach- Methode vor dem Hinzufügen aufrufen .
EntityFramework 6:
((IObjectContextAdapter)cs).ObjectContext.Detach(city1);
EntityFramework 4:
cs.Detach(city1);
Es gibt noch einen anderen Weg, falls Sie kein erstes DBContext-Objekt benötigen. Wickeln Sie es einfach mit mit Stichwort:
quelle
dbContext1.Entry(backgroundReport).State = System.Data.Entity.EntityState.Detached
'zum Trennen und konnte danndbContext2.Entry(backgroundReport).State = System.Data.Entity.EntityState.Modified;
zum Aktualisieren verwenden. Arbeitete wie ein TraumIch hatte das gleiche Problem, aber mein Problem mit der @ Slauma-Lösung (obwohl in bestimmten Fällen großartig) ist, dass empfohlen wird, den Kontext an den Dienst zu übergeben, was impliziert, dass der Kontext von meinem Controller verfügbar ist. Es erzwingt auch eine enge Kopplung zwischen meinem Controller und den Serviceschichten.
Ich verwende Dependency Injection, um die Service- / Repository-Ebenen in den Controller zu injizieren, und habe daher vom Controller aus keinen Zugriff auf den Kontext.
Meine Lösung bestand darin, dass die Service- / Repository-Schichten dieselbe Instanz des Kontexts verwenden - Singleton.
Kontext Singleton Klasse:
Referenz: http://msdn.microsoft.com/en-us/library/ff650316.aspx
und http://csharpindepth.com/Articles/General/Singleton.aspx
Repository-Klasse:
Es gibt andere Lösungen, z. B. das einmalige Instanziieren des Kontexts und das Übergeben an die Konstruktoren Ihrer Service- / Repository-Schichten oder eine andere, von der ich gelesen habe, dass sie das Unit of Work-Muster implementiert. Ich bin sicher, es gibt noch mehr ...
quelle
In meinem Fall habe ich das ASP.NET Identity Framework verwendet. Ich hatte die eingebaute
UserManager.FindByNameAsync
Methode verwendet, um eineApplicationUser
Entität abzurufen . Ich habe dann versucht, diese Entität auf eine neu erstellte Entität auf eine andere zu verweisenDbContext
. Dies führte zu der Ausnahme, die Sie ursprünglich gesehen haben.Ich habe dieses Problem gelöst, indem ich eine neue
ApplicationUser
Entität nur mitId
derUserManager
Methode from erstellt und auf diese neue Entität verwiesen habe.quelle
Ich hatte das gleiche Problem und konnte eine neue Instanz des Objekts erstellen, das ich aktualisieren wollte. Dann habe ich dieses Objekt an mein Reposotory übergeben.
quelle
In diesem Fall stellt sich heraus, dass der Fehler sehr klar ist: Entity Framework kann eine Entität nicht mit mehreren Instanzen von
IEntityChangeTracker
oder normalerweise mehreren Instanzen von verfolgenDbContext
. Die Lösungen sind: Verwenden Sie eine Instanz vonDbContext
; Zugriff auf alle benötigten Entitäten über ein einziges Repository (abhängig von einer Instanz vonDbContext
); oder Deaktivieren der Nachverfolgung für alle Entitäten, auf die über ein anderes Repository als dasjenige zugegriffen wird, das diese bestimmte Ausnahme auslöst.Wenn ich einer Umkehrung des Steuerungsmusters in der .Net Core-Web-API folge, stelle ich häufig fest, dass ich Controller mit Abhängigkeiten habe, wie z.
und Verwendung wie
Da alle drei Repositorys von unterschiedlichen
DbContext
Instanzen pro Anforderung abhängen , habe ich zwei Möglichkeiten, um das Problem zu vermeiden und separate Repositorys zu verwalten: Ändern Sie die Injektion des DbContext, um eine neue Instanz nur einmal pro Aufruf zu erstellen:Wenn die untergeordnete Entität schreibgeschützt verwendet wird, deaktivieren Sie die Nachverfolgung für diese Instanz:
quelle
Verwenden Sie während der gesamten Transaktion dasselbe DBContext-Objekt.
quelle
Ich habe das gleiche Problem nach der Implementierung von IoC für ein Projekt (ASP.Net MVC EF6.2) festgestellt.
Normalerweise initialisiere ich einen Datenkontext im Konstruktor eines Controllers und verwende denselben Kontext, um alle meine Repositorys zu initialisieren.
Die Verwendung von IoC zum Instanziieren der Repositorys führte jedoch dazu, dass alle unterschiedliche Kontexte hatten, und ich bekam diesen Fehler.
Im Moment habe ich nur die Repositories mit einem gemeinsamen Kontext neu gestaltet, während ich mir einen besseren Weg überlege.
quelle
So bin ich auf dieses Problem gestoßen. Zuerst muss ich meine speichern,
Order
die einen Verweis auf meineApplicationUser
Tabelle benötigt:Das Problem ist, dass ich einen neuen ApplicationDbContext initialisiere, um meine neue
Order
Entität zu speichern :Um das Problem zu lösen, habe ich denselben ApplicationDbContext verwendet, anstatt den integrierten UserManager von ASP.NET MVC zu verwenden.
An Stelle von:
Ich habe meine vorhandene ApplicationDbContext-Instanz verwendet:
quelle
Fehlerquelle:
Hoffe, jemand spart wertvolle Zeit
quelle