Heim >Backend-Entwicklung >C++ >Warum gibt mein Entity Framework-Code die Meldung „Neue Transaktion ist nicht zulässig, da in der Sitzung andere Threads ausgeführt werden' aus?

Warum gibt mein Entity Framework-Code die Meldung „Neue Transaktion ist nicht zulässig, da in der Sitzung andere Threads ausgeführt werden' aus?

Linda Hamilton
Linda HamiltonOriginal
2025-01-16 13:36:59315Durchsuche

Why Does My Entity Framework Code Throw

Transaktionsfehler beim Aktualisieren von Entity Framework-Modellen

Beim Versuch, Entitäten aus zwei separaten Datenbanken zu verbinden, stoßen Entwickler möglicherweise auf den Fehler: „Neu.“ Die Transaktion ist nicht zulässig, da in der Sitzung andere Threads ausgeführt werden. Diese verwirrende Meldung kann auftreten, wenn Code versucht wird, der mehrere Schleifen und Entity Framework-Kontexte enthält.

Das zugrunde liegende Problem ergibt sich aus der Tatsache, dass Entity Framework (EF) für jeden erstellten Kontext eine Sitzung verwaltet. Wenn mehrere Threads gleichzeitig auf denselben Kontext zugreifen, kann es zu Transaktionskonflikten kommen. Um dieses Problem zu beheben, ist es wichtig, zu vermeiden, dass derselbe Kontext in verschiedenen Threads geändert wird.

Im bereitgestellten Beispiel war die Hauptursache des Fehlers die Verwendung verschachtelter foreach-Schleifen über EF-Abfragen. Dieser Ansatz bedeutete, dass für jede Iteration der äußeren Schleife ein neuer EF-Kontext erstellt wurde, was dazu führte, dass zahlreiche aktive Sitzungen gleichzeitig auf denselben Kontext zugreifen.

Die optimale Lösung besteht darin, Daten mithilfe einer Abfrage aus EF abzurufen und zu speichern in einer Zwischensammlung (z. B. IList). Dadurch kann der Kontext gelöscht und für jede nachfolgende Iteration ein neuer Kontext erstellt werden, ohne dass es zu Transaktionskonflikten kommt.

Hier ist ein Beispiel des geänderten Codes zur Veranschaulichung:

IList<Client> clientList = from a in _dbFeed.Client.Include("Auto") select a;
foreach (RivWorks.Model.NegotiationAutos.Client client in clientList)
{
   var companyFeedDetailList = from a in _dbRiv.AutoNegotiationDetails where a.ClientID == client.ClientID select a;
    // ...
}

Durch die Isolierung des Durch den Abruf von Daten aus dem Kontext eliminieren wir das Risiko sich überschneidender Transaktionen und stellen sicher, dass keine Fehler auftreten.

Das obige ist der detaillierte Inhalt vonWarum gibt mein Entity Framework-Code die Meldung „Neue Transaktion ist nicht zulässig, da in der Sitzung andere Threads ausgeführt werden' aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn