Mit einem einzigen Zusammenhang, aus vielen threads in Entity Framework 6
Gibt es eine Möglichkeit, verwenden Sie eine dbContext in verschiedenen threads asynchron?
var context = new Entities();
Task.Factory.StartNew(() => context.Companies.Include(x => x.Address).First());
Task.Factory.StartNew(() => context.Companies.Include(x => x.Owner).First());
//after some changes...
context.SaveChanges();
context.Dispose();
Die Idee dabei ist, speichern Sie alles auf einmal, und wenn etwas nicht wieder alles ändert.
In der Realität bin ich mit Unit of Work-Objektes, welches übergeben wird, viewmodel und Ihr Kind viewmodels so dass Sie versuchen, an Informationen zu kommen asynchron... Der code oben zeigt das problem.
Der obige code löst eine Ausnahme:
Eine Ausnahme des Typs " System.InvalidOperationException' ist in EntityFramework.dll wurde aber nicht behandelt werden, in Benutzer-code
Der Kontext kann nicht verwendet werden, während das Modell erstellt wird. Diese Ausnahme kann ausgelöst werden, wenn der Kontext innerhalb der OnModelCreating Methode oder, wenn das gleiche context-Instanz ist, auf die mehrere threads gleichzeitig zugreifen. Beachten Sie, dass die Instanz, Mitglieder der DbContext und Verwandte Klassen nicht garantiert werden, um thread-safe.
Das Hauptproblem ist, wenn ich möchte mehrere Instanzen von DbContext jede der Daten-Transfer-Objekt enthält verschiedene Informationen für die Felder.
Irgendwelche Vorschläge?
Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem Kontext ist nicht thread-safe. Zeitraum. So nie und nimmer-Adresse ein Zusammenhang von mehreren threads und nicht durch Reifen springen, um zu versuchen und machen es thread-sicher.
Können Sie einfach wickeln Sie Ihren code in einer
TransactionScope
und beginnen jedenTask
mit einer Aktion, die schafft Ihren eigenen Kontext und speichert seine änderungen:lock
, wo? Eh, Nein, nicht einmal versuchen, einen Kontext, in eine thread-sichere Weise.TransactionScope
Wenn Sie SimpleInjector um eine Instanz von Ihr DbContext dann haben Sie ein problem des thread-sicher.
Für dieses Szenario müssen Sie die Verwendung von ThreadScopedLifestyle und Kapseln in Ihren code ein. Siehe: