Vorgehensweise: Auflösen von Parallelitätskonflikten durch Überschreiben von Datenbankwerten
Wenn Sie Unterschiede zwischen den erwarteten und den tatsächlichen Datenbankwerten abstimmen möchten, bevor Sie versuchen, Ihre Änderungen erneut zu übergeben, können Sie die Datenbankwerte mithilfe von KeepCurrentValues überschreiben. Weitere Informationen finden Sie unter Optimistische Nebenläufigkeit: Übersicht.
Hinweis
In allen Fällen wird der Datensatz auf dem Client erst durch Abrufen der geänderten Daten aus der Datenbank aktualisiert. Diese Aktion stellt sicher, dass der nächste Updateversuch nicht bei den gleichen Parallelitätsprüfungen fehlschlägt.
Beispiel
In diesem Szenario wird eine ChangeConflictException-Ausnahme ausgelöst, wenn User1 versucht, Änderungen zu übergeben, da User2 zwischenzeitlich die Assistant-Spalte und die Department-Spalte geändert hat. Die folgende Tabelle zeigt die Situation.
State | Manager | Assistant | Department |
---|---|---|---|
Ursprünglicher Datenbankzustand bei Abfrage durch User1 und User2. | Alfreds | Maria | Sales |
User1 bereitet sich auf die Übergabe dieser Änderungen vor. | Alfred | Marketing | |
User2 hat diese Änderungen bereits übergeben. | Mary | Dienst |
User1 entscheidet sich, diesen Konflikt durch das Überschreiben von Datenbankwerten mit den aktuellen Clientmemberwerten zu lösen.
Wenn User1 den Konflikt durch Verwendung von KeepCurrentValues behebt, entspricht das Ergebnis in der Datenbank der folgenden Tabelle:
State | Manager | Assistant | Department |
---|---|---|---|
Neuer Zustand nach Konfliktlösung. | Alfred (von User1) |
Maria (Original) |
Marketing (von User1) |
Im folgenden Beispielcode wird gezeigt, wie Datenbankwerte mit den aktuellen Clientmemberwerten überschrieben werden. (Keine Inspektion oder benutzerdefinierte Behandlung einzelner Memberkonflikte.)
try
{
db.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException e)
{
Console.WriteLine(e.Message);
foreach (ObjectChangeConflict occ in db.ChangeConflicts)
{
//No database values are merged into current.
occ.Resolve(RefreshMode.KeepCurrentValues);
}
}
Try
db.SubmitChanges(ConflictMode.ContinueOnConflict)
Catch ex As ChangeConflictException
Console.WriteLine(ex.Message)
For Each occ As ObjectChangeConflict In db.ChangeConflicts
' No database values are merged into current.
occ.Resolve(Data.Linq.RefreshMode.KeepCurrentValues)
Next
End Try