2015-02-22 1 views
0

Следующий код вызывает прерывистое исключение:прерывистого System.Data.Entity.Infrastructure.DbUpdateConcurrencyException

public int UnblockJob(int jobId) 
{ 
    using (var connect = MakeConnect()) 
    { 
     var tag = connect.JobTag.SingleOrDefault(jt => jt.JobId == jobId && jt.Name == Metrics.TagNameItemBlockCaller); 
     if (tag == null) 
     { 
      return 0; 
     } 
     connect.JobTag.Remove(tag); 
     return connect.SaveChanges(); 
    } 
} 

Как я могу исправить или устранить его?

ответ

3

Из документации для DbUpdateConcurrencyException:

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

Это означает, что запись, которую вы пытаетесь удалить, с тех пор была удалена из базы данных. Казалось бы, у вас есть другой процесс, который удаляет записи, или эта функция может быть вызвана одновременно.

Есть несколько решений, вот несколько:

Устранить проблему в источнике Stop других процессов, влияющих на данные.

Поймайте ошибка Wrap этот метод в try/catch блоке, в конце концов, вы можете заботиться только о том, что запись была удалена:

try 
{ 
    //Existing code here 
} 
catch(DbUpdateConcurrencyException) 
{ 
    //Safely ignore this exception 
} 
catch(Exception e) 
{ 
    //Something else has occurred 
    throw; 
} 
+0

Или - вы можете быть не хватает первичного ключа значение, передаваемое в обновлении процедура, которая затем приводит к TRYING для обновления неправильной записи (например, id = 0). Повторно проверьте данные, поступающие в процедуру обновления. –

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