在EF迁移中更新大量数据

本文关键字:数据 更新 EF 迁移 | 更新日期: 2023-09-27 18:28:14

我有一个SQL表,其中大约有一亿行,其模式由EF迁移管理。

我想更改链接到该表的枚举中的值,所以我需要将DB中的所有值更新为新值。像下面这样的东西。

this.Sql("UPDATE MyTable SET MyEnum=0 WHERE MyEnum=-1");

这在较小的表上是很好的,但由于表的大小,不适合一次性运行这么大的更新(我遇到连接超时、tempdb空间问题、事务日志空间问题等)。最好分批进行。例如:

while(ctx.MyTable.Any(m =>m.MyEnum == -1))
{
    this.Sql("UPDATE TOP (1000000) MyTable SET MyEnum=0 WHERE MyEnum=-1");
}

不幸的是,我无法在迁移期间找到从表中读取的方法(例如,在迁移ctx.MyTable.Any(m =>m.MyEnum == -1)期间如何做到这一点)。有没有一种方法可以做到这一点,这样我就可以批量进行EF迁移更新。

在EF迁移中更新大量数据

我的建议是,基于确切地知道EF对您来说有多慢(即使是在批量执行时),您应该创建一个存储过程来执行您想要执行的操作,然后让迁移在运行时简单地调用该存储过程。希望它能快速运行,因为一切都将在SQL方面完成。