Jedna z moich tabel ma unikalny klucz, a gdy próbuję wstawić duplikat, zgłasza wyjątek zgodnie z oczekiwaniami. Ale muszę odróżnić wyjątkowe wyjątki klucza od innych, aby móc dostosować komunikat o błędzie dla unikalnych naruszeń ograniczeń klucza.Jak mogę złapać wyjątki wyjątków UniqueKey za pomocą EF6 i SQL Server?
Wszystkie rozwiązania znalazłem internetowy proponuje rzucić ex.InnerException
do System.Data.SqlClient.SqlException
i sprawdzić czy Number
nieruchomość wynosi 2601 lub 2627 w sposób następujący:
try
{
_context.SaveChanges();
}
catch (Exception ex)
{
var sqlException = ex.InnerException as System.Data.SqlClient.SqlException;
if (sqlException.Number == 2601 || sqlException.Number == 2627)
{
ErrorMessage = "Cannot insert duplicate values.";
}
else
{
ErrorMessage = "Error while saving data.";
}
}
Ale problem jest, rzucając ex.InnerException
do System.Data.SqlClient.SqlException
przyczyny nieprawidłowy błąd rzutowania, ponieważ ex.InnerException
jest faktycznie typu System.Data.Entity.Core.UpdateException
, a nie System.Data.SqlClient.SqlException
.
Na czym polega problem z powyższym kodem? Jak mogę złapać naruszenie ograniczeń związanych z Unikalnym kluczem?
Po sprawdzeniu udostępnionego kodu widzę, że problem z moim kodem jest tak oczywisty. Powinienem napisać "ex.InnerException.InnerException jako SqlException" zamiast "ex.InnerException jako SqlException". –
Czy istnieje sposób wykrycia również, w którym przypadku doszło do naruszenia kolumny? W jednej tabeli może znajdować się wiele unikalnych kluczy ... – Learner
@Learner Jedynym sposobem, jaki mogę wymyślić, to przeanalizowanie komunikatu o błędzie (który określa nazwę ograniczenia/kolumny), ale nie byłoby to zbyt dobre rozwiązanie (komunikaty o błędach mogą być aktualizowane w przyszłości, a co ważniejsze, są tłumaczone na wiele języków) – ken2k