Что касается SQL Server, я бы предложил фильтрацию SqlException.Number 2601 и 2627 для выявления нарушений ограничений первичного ключа / уникального ключа:
- 2601: невозможно вставить строку дублированного ключав объекте "%. * ls" с уникальным индексом "%. * ls".Значение дублированного ключа% ls.
- 2627: Нарушение ограничения% ls "%. * Ls".Невозможно вставить повторяющийся ключ в объект "%. * Ls".Значение ключа-дубликата:% ls.
Пример кода:
try {
using(var db = new DatabaseContext()) {
db.SaveChanges();
}
}
catch(UpdateException ex) {
var sqlException = ex.InnerException as SqlException;
if(sqlException != null && sqlException.Errors.OfType<SqlError>()
.Any(se=>se.Number == 2601 || se.Number == 2627 /* primary key/unique key constraint violation */)) {
// handle duplicate
}
}
Еще один подход - проверка на наличие дубликатов перед вставкой.
Для этого убедитесь, чтовыполнить оба действия в атомарной транзакции, чтобы избежать проблем параллелизма.В противном случае две или более транзакций могут попытаться вставить запись с одним и тем же ключом.