DbUpdateConcurrencyException “client wins” and “store wins” resolution helpers
Whenever I’m dealing with DbUpdateConcurrencyException
I don’t what is “client wins” and “store wins” look like. I can at the end figure it out because I know how the ObjectStateManager
/ChangeTracker
works and I kind of know where I’m heading. But going slowly though IntelliSense isn’t what I like to do.
In the old days of ObjectContext
and OptimisticConcurrencyException
it was easy. All you’ve had to do was use RefreshMode
and “refresh”. But that’s past. The DbUpdateConcurrencyException
era is here I can’t do anything about it. Except I actually can (if I skip the idea of beign stubborn and using ObjectContext
). I can write myself helpers. 😮)
static class DbUpdateConcurrencyExceptionExtensions
{
public static void ClientWins(this DbUpdateConcurrencyException exception)
{
var entry = exception.Entries.First();
entry.OriginalValues.SetValues(entry.GetDatabaseValues());
}
public static async Task ClientWinsAsync(this DbUpdateConcurrencyException exception)
{
var entry = exception.Entries.First();
entry.OriginalValues.SetValues(await entry.GetDatabaseValuesAsync().ConfigureAwait(false));
}
public static void StoreWins(this DbUpdateConcurrencyException exception)
{
var entry = exception.Entries.First();
entry.Reload();
}
public static Task StoreWinsAsync(this DbUpdateConcurrencyException exception)
{
var entry = exception.Entries.First();
return entry.ReloadAsync();
}
}
Now as I wrote the implementation, basically twice, I think I’ve learned it enough that I don’t need these anymore. 😃 Maybe it will help others while looking for these strategies.