Ich verwende Entity Framework für den Zugriff auf meine SQL-Daten. Ich habe einige Beschränkungen im Datenbankschema und ich frage mich, wie man Ausnahmen behandelt, die durch diese Beschränkungen verursacht werden.Entity Framework: Wie umgehen Sie Ausnahmen, die aufgrund von SQL-Einschränkungen auftreten
Als Beispiel bekomme ich die folgende Ausnahme in einem Fall, in dem zwei Benutzer versuchen, eine (fast) identische Entität zu der DB gleichzeitig hinzuzufügen.
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."
Wie kann ich diese spezifische Ausnahme richtig erfassen?
Schmutzige Lösung:
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;
}
}
Jetzt, während dieser Ansatz funktioniert, hat es einige Nachteile:
- Keine Typsicherheit: Der Code auf der Ausnahmemeldung abhängig ist, die den Namen des enthält eindeutige Spalte.
- Abhängigkeit von den SQLClient Klassen (gebrochene Abstraktion)
Kennen Sie eine bessere Lösung? Vielen Dank für alle Feedback ..
Hinweis: ich nicht die Einschränkungen manuell innerhalb der Anwendungsschicht codieren will, ich will, dass sie in der DB haben.
Okay, aber selbst wenn ich diese ID verwende, muss ich die Ausnahmebedingung für den Spaltennamen parsen. – driAn
@driAn: richtig. SQL hat auch keinen nativen Mechanismus, um zu einer Einschränkung oder Spalte zu bohren, was bedeutet, dass es keine API oder dergleichen gibt, um sie zu lesen. – gbn