Столкнулся тут с ошибкой в таком коде на шарпе
для простоты написал псевдокодом. но идея в том что табла меняется из 2 мест по сути в рамках энтити контекста и в скл самом и кидается такой экспешн DbUpdateConcurrencyException
begin tran
efContext.ExecuteSqlRaw("update users set time = getdate() where id = 5")
var user = efContext.Single(a => a.id == 5);
user.time = Now
efContex.Users.Update(user);
efContext.SaveChanges()
commit tran
решение я нашел
тут
но мне показалось странным выставлять значение в обработке эксепшна.
Есть решение получше или всё же это нормально?
catch (DbUpdateConcurrencyException ex)
{
foreach (var entry in ex.Entries)
{
if (entry.Entity is Person)
{
var proposedValues = entry.CurrentValues;
var databaseValues = entry.GetDatabaseValues();
foreach (var property in proposedValues.Properties)
{
var proposedValue = proposedValues[property];
var databaseValue = databaseValues[property];
// TODO: decide which value should be written to database
// proposedValues[property] = <value to be saved>;
}
// 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 "
+ entry.Metadata.Name);
}
}
}