Vorgehensweise: Lösen von Parallelitätskonflikten durch das Zusammenführen mit Datenbankwerten (LINQ to SQL)

Wenn Sie vor dem erneuten Übergeben Ihrer Änderungen die Unterschiede zwischen erwarteten und tatsächlichen Datenbankwerten ausgleichen möchten, können Sie mit KeepChanges Datenbankwerte mit den aktuellen Clientmemberwerten zusammenführen. Weitere Informationen finden Sie unter Vollständige Parallelität – Übersicht (LINQ to SQL).

HinweisHinweis

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.

 

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

Service

User1 entscheidet sich, diesen Konflikt durch das Zusammenführen von Datenbankwerten mit den aktuellen Clientmemberwerten zu lösen. Im Ergebnis werden die Datenbankwerte nur dann überschrieben, wenn der aktuelle Änderungssatz diese Werte ebenfalls verändert hat.

Wenn User1 den Konflikt durch Verwendung von KeepChanges behebt, entspricht das Ergebnis in der Datenbank der folgenden Tabelle:

 

Manager

Assistant

Department

Neuer Zustand nach Konfliktlösung.

Alfred

(von User1)

Mary

(von User2)

Marketing

(von User1)

Im folgenden Beispielcode wird gezeigt, wie Datenbankwerte mit den aktuellen Clientmemberwerten zusammengeführt werden (sofern der Client den Wert nicht ebenfalls geändert hat). Keine Inspektion oder benutzerdefinierte Behandlung einzelner Memberkonflikte.

Try
    db.SubmitChanges(ConflictMode.ContinueOnConflict)

Catch ex As ChangeConflictException
    Console.WriteLine(ex.Message)

    For Each occ As ObjectChangeConflict In db.ChangeConflicts
        ' Automerge database values into current for members
        ' that client has not modified.
        occ.Resolve(Data.Linq.RefreshMode.KeepChanges)
    Next

End Try

' Submit succeeds on second try.
db.SubmitChanges(ConflictMode.FailOnFirstConflict)
try
{
    db.SubmitChanges(ConflictMode.ContinueOnConflict);
}

catch (ChangeConflictException e)
{
    Console.WriteLine(e.Message);
    // Automerge database values for members that client
    // has not modified.
    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
        occ.Resolve(RefreshMode.KeepChanges);
    }
}

// Submit succeeds on second try.
db.SubmitChanges(ConflictMode.FailOnFirstConflict);

Siehe auch

Aufgaben

Vorgehensweise: Beheben von Parallelitätskonflikten durch das Überschreiben von Datenbankwerten (LINQ to SQL)

Vorgehensweise: Beheben von Parallelitätskonflikten durch das Erhalten von Datenbankwerten (LINQ to SQL)

Weitere Ressourcen

Vorgehensweise: Verwalten von Änderungskonflikten (LINQ to SQL)