Używam Entity Framework, aby uzyskać dostęp do moich danych SQL. Mam pewne ograniczenia w schemacie bazy danych i zastanawiam się, jak obsługiwać wyjątki, które są spowodowane przez te ograniczenia.Entity Framework: Jak prawidłowo obsługiwać wyjątki, które występują z powodu ograniczeń SQL
Jako przykład, otrzymuję następujący wyjątek w przypadku, gdy dwóch użytkowników próbuje jednocześnie dodać (prawie) identyczną jednostkę do bazy danych.
System.Data.UpdateException
"An error occurred while updating the entries. See the InnerException for details."
(inner exception) System.Data.SqlClient.SqlException
"Violation of UNIQUE KEY constraint 'Unique_GiftId'. Cannot insert duplicate key in object 'dbo.Donations'.\r\nThe statement has been terminated."
Jak prawidłowo wychwycić ten wyjątek?
Brudny rozwiązanie:
catch (UpdateException ex)
{
SqlException innerException = ex.InnerException as SqlException;
if (innerException != null && innerException.Message.StartsWith("Violation of UNIQUE KEY constraint 'Unique_GiftId'"))
{
// handle exception here..
}
else
{
throw;
}
}
Teraz, gdy takie podejście działa, to ma pewne wady:
- Brak typu bezpieczeństwa: Kod zależy od wiadomości wyjątek, który zawiera nazwę unikalna kolumna.
- zależność od klas SqlClient (złamane abstrakcja)
Znasz lepsze rozwiązanie tego problemu? Dzięki za wszystkie informacje zwrotne ..
Uwaga: Nie chcę zakodować ograniczeń ręcznie w warstwie aplikacji, chcę mieć je w DB.
OK, ale nawet jeśli używam tego identyfikatora, muszę przeanalizować komunikat wyjątku dla nazwy kolumny. – driAn
@driAn: poprawne. SQL nie ma również natywnego mechanizmu do wiercenia, do którego wiązania lub kolumny, co oznacza, że nie ma API lub coś takiego do odczytu. – gbn