Ich füge eine neue Methode in meinem generischen Repository ein, um einen Datensatz direkt aus der DbConext
zu löschen, anstatt den DbConext
und dann seine SaveChanges
.
So tat ich:
public virtual void Delete(int id)
{
var connection = dataContext.GetDatabase().Connection;
var query = string.Format("DELETE FROM {0} WHERE id = {1}", tableName, id);
connection.Execute(query);
}
Mein aktueller Code, der Entitäten mit dem DbContext
löscht, handhabt DbUpdateException
, und diese Ausnahme kommt auf den Client über.
Bewirkt die Execute
Erweiterung von Dapper auch diese Ausnahme?
nein, tut es nicht; Wenn Sie das wollen, sollten Sie Dinge wie select @@rowcount
nach dem delete
in der tsql auswählen, mit ExecuteScalar<int>
und überprüfen, ob die zurückgegebene Zahl 1
. Wenn Sie eine Zeitstempelprüfung wünschen, würden Sie diese in die where
Klausel und als Parameter aufnehmen
niemals, niemals, niemals Eingänge in den Datenteil von SQL verketten; Es erzeugt ein SQL-Injection-Risiko und zerstört alle Abfrage- / Operations-Caches - der erste Grund ist jedoch alles, was Sie jemals brauchen sollten. Hier gibt es ein wenig Vorbehalte, wenn es um Tabellennamen geht, aber Sie sollten dort einen weißen Eintrag machen. Beachten Sie, dass Dapper die vollständige Parametrisierung unterstützt (die einfache Parameterbehandlung ist einer der Hauptgründe für die Verwendung!)
Zum Beispiel würde ich etwas tun wie:
public YourType(string tableName) { // constructor
WhiteList.AssertValid(tableName); // throws if not allowed
deleteCommand = $"DELETE FROM [{tableName}] WHERE id = @id; SELECT @@ROWCOUNT;";
}
private readonly string deleteCommand;
public virtual void Delete(int id)
{
var connection = dataContext.GetDatabase().Connection;
int count = connection.ExecuteScalar<int>(deleteCommand, new { id });
if(count != 0) throw new DbUpdateException();
}
Alternativ verwenden Sie ein Add-on-Tool wie dapper-contrib, das all diese Dinge für Sie erledigt.
Ich weiß, das ist keine Antwort auf die eigentliche Frage, aber imho, du solltest gehen
Den Grund für DbUpdateException finden
Auf diese Weise können Sie die Execute-Methode überschreiben, die Ursache ermitteln und endgültig beheben.