Wie ist es möglich, eine Zeile beim Lesen mit EF Core zu sperren? Ich habe mit TransactionScope
eine einfache Lösung gefunden, aber sie scheint nicht zu funktionieren (Klasse nicht gefunden)
Das Problem ist, wenn ich ein Element lösche, das ich in einem Thread mache, und zweimal auf die Löschtaste drücke, das Element ist nicht das zweite Mal da, also bekomme ich eine Ausnahme.
Meine erste Lösung bestand darin, zu überprüfen, ob das Element noch vorhanden ist, aber da die Methode als Task aufgerufen wird, wird die Überprüfung von beiden Tasks durchgeführt, bevor sie von beiden gelöscht werden. Daher müsste ich diese Zeile sperren, um zu verhindern, dass die zweite Aufgabe einen Fehler erzeugt.
Eine schnell-n-schmutzige Lösung wäre natürlich mit leerem Fang zu versuchen, aber ich würde es vorziehen, dies auf eine saubere Art und Weise zu handhaben.
Eine andere Option ist, EF für Ihre Löschvorgänge einfach nicht zu verwenden.
Wenn Sie das rohe SQL DELETE TableName WHERE PrimaryKey = @Key
und der Datensatz bereits gelöscht wurde, erhalten Sie keinen Fehler.
Dapper
using (var sqlConnection = new System.Data.SqlClient.SqlConnection(Connectionstring))
{
sqlConnection.Open();
string sqlQuery = "DELETE FROM [dbo].[Customer] WHERE CustomerId=@CustomerId";
sqlConnection.Execute(sqlQuery, new {customerId});
sqlConnection.Close();
}
Tortuga-Kette
dataSource.DeleteByKey ( "Customer", CustomerId).Execute();
EF
using (var context = new [...]) {
context.Database.ExecuteSqlCommand("DELETE FROM [dbo].[Customer] WHERE CustomerId=@CustomerId", new SqlParameter("@CustomerId", CustomerId));
}
(Ja, die Verwendung von EF zur Ausführung einer Nicht-EF-Abfrage ist verschwenderisch, aber es ist eine Option.)
Ich denke, dass Sie Ihre ef-Abfragen immer in try / catch schützen sollten, wenn Sie INSERT, UPDATE oder DELETE verursachen, da Sie Ausnahmen unter verschiedenen routinemäßigen Bedingungen wie Verletzung von Fremdschlüsseln, Datensatz nicht gefunden usw. auslösen können als ein Fehler, aber nicht tödlich, so sollte behandelt werden. Dann wird Ihre Frage nicht dadurch beantwortet, wie Sie eine Ausnahme vermeiden, sondern dafür sorgen, dass Sie nicht überrascht wird.