Code: Select all
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[ConcurrencyCheck]
public long RowVersion { get; set; }
}
{
const int retryCount = 3;
for (int i = 0; i < retryCount; i++)
{
try
{
var result = await base.SaveChangesAsync(cancellationToken);
return result;
}
catch (DbUpdateConcurrencyException ex)
{
if (i == retryCount - 1)
{
throw;
}
foreach (var entry in ex.Entries)
{
if (entry.Entity is Person)
{
var proposedValues = entry.CurrentValues;
var databaseValues = await entry.GetDatabaseValuesAsync();
var originalValues = entry.OriginalValues;
if (databaseValues == null)
{
throw new Exception("Person entity was deleted before update.");
}
foreach (var property in proposedValues.Properties)
{
var proposedValue = proposedValues[property];
var databaseValue = databaseValues[property];
var originalValue = originalValues[property];
if (originalValue != proposedValue)
{
proposedValues[property] = proposedValue;
}
else
{
proposedValues[property] = databaseValue;
}
}
// Refresh original values to bypass next concurrency check
entry.OriginalValues.SetValues(databaseValues);
}
else
{
throw new NotSupportedException(
$"Don't know how to handle concurrency conflicts for entity {entry.Metadata.Name}");
}
}
await Task.Delay(50 * (i + 1), cancellationToken);
}
}
return 0;
}
< /code>
Wie erhalte ich die tatsächlichen Werte aus der Datenbank? Oder was könnte das Problem sein?