Procedure: Conflicten oplossen door samen te voegen met databasewaarden
Als u de verschillen tussen de verwachte en de werkelijke databasewaarden wilt afstemmen voordat u de wijzigingen opnieuw probeert in te dienen, kunt u databasewaarden KeepChanges samenvoegen met de huidige clientlidwaarden. Zie Optimistische gelijktijdigheid voor meer informatie: Overzicht.
Notitie
In alle gevallen wordt de record op de client eerst vernieuwd door de bijgewerkte gegevens uit de database op te halen. Met deze actie zorgt u ervoor dat de volgende update niet mislukt bij dezelfde gelijktijdigheidscontroles.
Opmerking
In dit scenario wordt een ChangeConflictException uitzondering gegenereerd wanneer Gebruiker1 probeert wijzigingen in te dienen, omdat Gebruiker2 ondertussen de kolommen Assistent en Afdeling heeft gewijzigd. In de volgende tabel ziet u de situatie.
Provincie | Manager | Assistent | Afdeling |
---|---|---|---|
De oorspronkelijke databasestatus wordt opgevraagd door Gebruiker1 en Gebruiker2. | Alfreds | Maria | Verkoop |
Gebruiker1 bereidt zich voor om deze wijzigingen in te dienen. | Alfred | Marketing | |
Gebruiker2 heeft deze wijzigingen al ingediend. | Mary | Service |
Gebruiker1 besluit dit conflict op te lossen door databasewaarden samen te voegen met de huidige clientlidwaarden. Het resultaat is dat databasewaarden alleen worden overschreven wanneer de huidige wijzigingenset die waarde ook heeft gewijzigd.
Wanneer Gebruiker1 het conflict oplost met behulp van KeepChanges, is het resultaat in de database zoals in de volgende tabel:
Provincie | Manager | Assistent | Afdeling |
---|---|---|---|
Nieuwe status na conflictoplossing. | Alfred (van gebruiker1) |
Mary (van Gebruiker2) |
Marketing (van gebruiker1) |
In het volgende voorbeeld ziet u hoe u databasewaarden kunt samenvoegen met de huidige waarden van het clientlid (tenzij de client die waarde ook heeft gewijzigd). Er treedt geen inspectie of aangepaste verwerking van afzonderlijke lidconflicten op.
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);
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)