Мы использовали блок try, чтобы оградить нас от ошибок сохранения.
try{
using(Context context = new Context()){
Entity x = context.Entities.First();
x.ModifyMe = true;
context.SaveChanges();
}
}catch(UpdateException e){
//convert to friendly message
}
Если вы хотите поймать исключение более низкого уровня, существует также исключение OptimisticConcurrencyException
Мы также пошли немного дальше и просто обернули наши SaveChanges в метод расширения, который назывался защищенным сохранением изменений.
public static class Extension{
public static List<Error> ProtectedSaveChanges(this ObjectContext context){
try{
context.SaveChanges();
}catch(UpdateException e ){
//Convert to freindly and return
}
}
}
И, хотите верьте, хотите нет, мы решили пойти еще дальше и создали специальную функцию, которая определяла, как преобразовать метод исключения в более удобную для пользователя ошибку. Если вы хотите, чтобы это тоже, дайте мне знать, и я могу написать.
Что касается альтернативного способа, я видел, как люди используют экранирование исключений (EL), но я не знаю, есть ли встроенные обработчики событий для ошибок.