Hier ist ein kleines Experiment, das ich tat:Linq-Caching-Datenwerte - großes Nebenläufigkeitsproblem?
MyClass obj = dataContext.GetTable<MyClass>().Where(x => x.ID = 1).Single();
Console.WriteLine(obj.MyProperty); // output = "initial"
Console.WriteLine("Waiting..."); // put a breakpoint after this line
obj = null;
obj = dataContext.GetTable<MyClass>().Where(x => x.ID = 1).Single(); // same as before, but reloaded
Console.WriteLine(obj.MyProperty); // output still = "initial"
obj.MyOtherProperty = "foo";
dataContext.SubmitChanges(); // throws concurrency exception
Wenn ich den Haltepunkt nach Zeile 3, traf ich auf ein SQL-Abfrage-Fenster gehen und den Wert manuell ändern, um „aktualisiert“. Dann renne ich weiter. Linq lädt mein Objekt nicht neu, sondern verwendet das zuvor gespeicherte Objekt erneut! Dies ist ein riesiges Problem für Daten Nebenläufigkeit!
Wie bewerten Sie diesen versteckten Cache von Objekten deaktivieren, die Linq offensichtlich im Speicher zu halten?
EDIT - Bei näherer Betrachtung ist es einfach undenkbar, dass Microsoft eine solche klaffenden Abgrund im Linq Rahmen verlassen haben könnte. Der obige Code ist eine verdummte Version dessen, was ich gerade tue, und vielleicht gibt es kleine Feinheiten, die ich übersehen habe. Kurz gesagt, würde ich mich freuen, wenn Sie Ihre eigenen Experimente durchführen würden, um zu bestätigen, dass meine obigen Ergebnisse richtig sind. Alternativ muss es eine Art "geheimer Schalter" geben, der Linq gegen gleichzeitige Datenaktualisierungen robust macht. Aber was? Diese
+1 OMG, es ist wirklich ein Gotcha! Muss das hinzufügen, um die C# Gotcha KB ... –
Schlimmer noch, wenn Sie seinen Rat dort befolgen und ObjectTrackingEnabled = false setzen, können Sie nur aus der DB lesen; Sie können SubmitChanges nicht tun! Das macht das Leben wirklich schwierig! –
Hier ist ein Link zu der C# Gotcha KB: http://StackOverflow.com/Questions/241134/Bat-ist-the-Worst-C-Net-Goecha –