使用Entity Framework Core锁定数据库行

时间:2016-07-24 21:36:32

标签: c# multithreading entity-framework-core

如何使用EF Core锁定读取行?我找到了一个使用return HttpResponse(response)的简单解决方案,但它们似乎不起作用(找不到类)

问题是当删除一个项目时,我在一个帖子中做了,然后按两次删除按钮,第二次没有该项目,所以我得到一个例外。

我的第一个解决方案是检查项目是否仍然存在,但是当方法被称为任务时,检查由两个任务执行,然后才会删除它。所以我需要锁定这一行来阻止第二个任务产生错误。

快速肮脏的解决方案当然可以尝试空捕获,但我更愿意以干净的方式处理它。

3 个答案:

答案 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#中处理的输出参数。

这是传统和恕我直言最佳方式。