我想知道为什么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次工作。