当表上有这样的实体要删除时,为什么EF扩展不抛出异常?



我想知道为什么BulkDelete不抛出异常,如果没有这样的实体删除数据库?我被迫检查数据库是否有一些匹配的实体,并在调用BulkDelete方法后发送我从查询数据库中得到的匹配实体。EF扩展有一些自动化的选项吗?

你不必检查数据库。我假设你用的是EF Extensions - BulkDelete。当你调用BulkDelete时,你只是删除它,但要对数据库进行更改,你必须执行.SaveChanges();-该方法返回受影响的行数。

所以,如果数字是0,那么你知道你的DELETE失败了。如果数字大于0,则您知道DELETE已成功执行

BulkDelete已经过性能优化。

因此,不需要先检查实体是否存在,我们只需要执行Delete操作。

你可以在使用BulkDelete之前先使用BulkRead方法,这样更容易。

var customers = context.Customers.BulkRead(deserializedCustomers);

文档:https://entityframework-extensions.net/bulk-read

通过使用此方法,您将能够轻松地与当前列表进行比较,例如获得数据库中不存在的客户列表。

您也可以获得rowaffected并将其与列表计数进行比较:https://entityframework-extensions.net/rows-affected

我想知道为什么BulkDelete不抛出异常,如果没有这样的实体删除数据库?

因为拥有一个最终产生0个结果的过滤器并没有错。这本身并不是一个错误的状态。

当然,对于一个特定的用例,您可能希望至少找到一些东西,但是一个通用的库不能解释您在特定用例中的特定期望。在很多情况下,最终没有删除某些内容并不是一个有问题的场景,例如,如果存在,则每日清理作业删除旧条目。如果没有旧条目,那就不是抛出异常的理由。它只是表示不需要删除任何内容。

这与foreach在传递空集合时不抛出异常的原因没有什么不同。foreach仍然在做它的工作,即为集合中的每个项目执行工作。有0项,因此它执行了0次工作。

最新更新