2015-05-02 4 views
1

При создании лесов ApiController с асинхронными действиями и поддержкой Entity Framework в Visual Studio 2013 некоторые методы завершают DbContext.SaveChangesAsync звонки в try-catch блоках.DbContext.SaveChangesAsync Обработка исключений

Например, метод Put,

try 
{ 
    await db.SaveChangesAsync(); 
} 
catch (DbUpdateConcurrencyException) 
{ 
    if (!EmployeeExists(id)) 
    { 
     return NotFound(); 
    } 
    throw; 
} 

От msdn.microsoft.com о DbUpdateConcurrencyException,

Исключение брошенной DbContext, когда ожидается, что SaveChanges для объекта приведет в обновлении базы данных, но на самом деле никаких строк в базе данных не было.

The DbUpdateConcurrencyException является производным от DbUpdateException и есть несколько других исключений, которые могут быть выброшены из метода DbContext.SaveChangesAsync.

Мне интересно, почему для этих other exceptions нет предложений об уловке? Это ради краткости? Или они просто не принадлежат на этом уровне в заявке?

ответ

3

Контроллер лесов Web API следует за семантикой REST, поэтому PUT представляет собой эффективное обновление записи.

В сообщении MSDN указано, что исключение генерируется, если запись не была обновлена, поэтому в этом случае она выдает исключение, если запись не обновляется. Если запись не существует, возвращается 404 не найден.

Таким образом, хотя исключение выбрасывается базой данных, оно может быть допустимым случаем в контексте службы REST (обновление не выполняется, поскольку запись не существует), а не реальная ошибка. Другие исключения будут закрыты для клиента.

+0

Спасибо, это имеет смысл. –

Смежные вопросы