DbUpdateConcurrencyException
От: merge  
Дата: 15.06.22 11:09
Оценка:
Столкнулся тут с ошибкой в таком коде на шарпе

для простоты написал псевдокодом. но идея в том что табла меняется из 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);
            }
        }
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.