How to: Resolve Concurrency Conflicts by Merging with Database Values (LINQ to SQL)
To reconcile differences between expected and actual database values before you try to resubmit your changes, you can use KeepChanges to merge database values with the current client member values. For more information, see Optimistic Concurrency Overview (LINQ to SQL).
Note
In all cases, the record on the client is first refreshed by retrieving the updated data from the database. This action makes sure that the next update try will not fail on the same concurrency checks.
Example
In this scenario, a ChangeConflictException exception is thrown when User1 tries to submit changes, because User2 has in the meantime changed the Assistant and Department columns. The following table shows the situation.
|
Manager |
Assistant |
Department |
---|---|---|---|
Original database state when queried by User1 and User2. |
Alfreds |
Maria |
Sales |
User1 prepares to submit these changes. |
Alfred |
|
Marketing |
User2 has already submitted these changes. |
|
Mary |
Service |
User1 decides to resolve this conflict by merging database values with the current client member values. The result will be that database values are overwritten only when the current changeset has also modified that value.
When User1 resolves the conflict by using KeepChanges, the result in the database is as in the following table:
|
Manager |
Assistant |
Department |
---|---|---|---|
New state after conflict resolution. |
Alfred (from User1) |
Mary (from User2) |
Marketing (from User1) |
The following example shows how to merge database values with the current client member values (unless the client has also changed that value). No inspection or custom handling of individual member conflicts occurs.
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);
See Also
Tasks
How to: Resolve Concurrency Conflicts by Overwriting Database Values (LINQ to SQL)
How to: Resolve Concurrency Conflicts by Retaining Database Values (LINQ to SQL)