Обработка параллелизма в API ef 4.1 dbContext - PullRequest
0 голосов
/ 16 марта 2012

Я только начал использовать новый API dbContext с классами poco. Теперь у меня есть небольшая проблема с обработкой параллелизма. Во всех моих таблицах есть столбец RowVersion (фиксированный, вычисляемый). Я пытался следить за этим содержанием: http://blogs.msdn.com/b/adonet/archive/2011/02/03/using-dbcontext-in-ef-feature-ctp5-part-9-optimistic-concurrency-patterns.aspx

поэтому у меня есть что-то вроде этого:

using (var context = new UnicornsContext())
{
    bool saveFailed;

    var unicorn = context.Unicorns.Find(1);
    unicorn.Name = "Franky";

    do
    {
        saveFailed = false;
        try
        {
            context.SaveChanges();
        }
        catch (DbUpdateConcurrencyException ex)
        {
            saveFailed = true;

            // Update original values from the database
            var entry = ex.Entries.Single();
            entry.OriginalValues.SetValues(entry.GetDatabaseValues());
        }

    } while (saveFailed);
}

Но когда я провоцирую это, это не работает так, как должно. Прежде всего, нет исключения DbUpdateConcurrencyException, но DbUpdateException. Затем, когда я ловлю DbUpdateException, я получаю еще одно исключение в строке var entry = ex.Entries.Single();:

InvalidOperationException: «Последовательность не содержит элементов»

1 Ответ

0 голосов
/ 10 февраля 2016

Вы не проверяете состояние, которое могло быть удалено

var entry = dbUpdateConcurrencyException.Entries.Single();

if (entry.State == EntityState.Deleted)
{
    entry.State = EntityState.Detached;
}
else
{
  entry.OriginalValues.SetValues(entry.GetDatabaseValues());
  objContext.Refresh(RefreshMode.ClientWins, dbUpdateConcurrencyException.Entries.Select(e => e.Entity));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...