如何使用EF Core锁定读取行?我找到了一个使用return HttpResponse(response)
的简单解决方案,但它们似乎不起作用(找不到类)
问题是当删除一个项目时,我在一个帖子中做了,然后按两次删除按钮,第二次没有该项目,所以我得到一个例外。
我的第一个解决方案是检查项目是否仍然存在,但是当方法被称为任务时,检查由两个任务执行,然后才会删除它。所以我需要锁定这一行来阻止第二个任务产生错误。
快速肮脏的解决方案当然可以尝试空捕获,但我更愿意以干净的方式处理它。
答案 0 :(得分:1)
另一种选择是不要将EF用于删除操作。
如果您执行原始SQL DELETE TableName WHERE PrimaryKey = @Key
并且记录已被删除,那么您将不会收到错误。
<强>小巧玲珑强>
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 Chain
dataSource.DeleteByKey ( "Customer", CustomerId).Execute();
<强> EF 强>
using (var context = new [...]) {
context.Database.ExecuteSqlCommand("DELETE FROM [dbo].[Customer] WHERE CustomerId=@CustomerId", new SqlParameter("@CustomerId", CustomerId));
}
(是的,使用EF执行非EF查询是浪费,但这是一个选项。)
答案 1 :(得分:1)
我觉得你应该在导致INSERT,UPDATE或DELETE时始终屏蔽你的ef查询,因为你可以在各种常规条件下触发异常,例如外键违规,记录未找到等等。这样的例外应该被视为一个错误,但不是致命的,所以应该处理。然后你的问题不是通过如何避免异常来回答,而是确保它不会让你感到惊讶。
答案 2 :(得分:0)
将Delete语句写入存储过程(具有将在delete stmt的where子句中使用的必要参数)并在EF中调用该存储过程。 DB将负责并发性。如果您需要知道存储过程是否删除了任何记录,它可以返回受影响的行作为您可以在C#中处理的输出参数。
这是传统和恕我直言最佳方式。