我知道有两种主要方法可以从EF Core中的表中完全清除所有记录。
_context.TableName.RemoveRange(_context.TableName);
_context.SaveChanges();
和
_context.Database.ExecuteSqlCommand("TRUNCATE TABLE [TableName]");
第一个非常慢,因为它似乎遍历记录集并删除单个记录(将它们分成小组,但对于大型数据集则需要很长时间)。第二个要求对数据库的更改权限(尽管我的特定应用程序确实具有这种权限,但感觉像是一个限制),并且在EF Core交互中具有直接SQL的特质(应尽可能避免这种情况,以确保我们保持松散耦合我们可以管理的数据库)。通过将“清除”作为一种方法移入db上下文可以避免第二个问题,在这种情况下,当我们更改数据库提供程序时,可以轻松地更新清除方法,但对我来说仍然很奇怪。
其中哪些是最佳做法?我还缺少第三种选择吗?
答案 0 :(得分:0)
简单来说,在EF中没有清除表的“性能”方法。只要您在一个事务中删除所有内容,EF就会对其进行批处理,但它仍将一次发出一行DELETE查询。
就SQL而言,最好的选择是TRUNCATE。没有EF命令,但是您可以从上下文访问基础数据库提供程序并直接发出SQL。但是,我不确定将其作为请求的一部分是一个绝妙的主意。您可能希望将其安排在外部流程上。
此外,如果您的应用程序正在使用的数据库用户实际上具有截断特权,那么您的安全性太差了。使用外部进程将允许您使用具有确实权限的其他用户,并进一步限制您的Web用户。确实,如果Web DB用户具有比SELECT,INSERT,UPDATE,DELETE(甚至DELETE还值得怀疑)更多的访问权限,那么您就可能会遇到安全问题。如果需要,应仅在特定的存储过程上授予执行权限,而不是整个数据库。