如何使用Entity Framework Core或Dapper批量更新表的列?

时间:2019-05-08 20:31:54

标签: dapper entity-framework-core-2.2

我需要知道使用EF Core或Dapper从所有行更新单列的最佳方法是什么。我想这叫做批量更新。

我尝试了EF Plus,但在阅读了有关许可证试用版后便卸载了该软件,并且正在Dapper或Entity Framework中寻找一种免费的方法。

我想,尽管我认为是否必须编写原始SQL或创建存储过程很重要。

1 个答案:

答案 0 :(得分:1)

使用纯Dapper,这很简单-

string sql = "UPDATE Table SET Field1 = newvalue ....";
con.Execute(sql,.....);

现在,我不确定您为什么在这里参与EF。 EF是完整的ORM。我没用过但是我经常使用它的哥哥-NHibernate。

完整的ORM在UoW下不支持批量(更新/删除)操作。为了使UoW正常工作,必须将实体加载到内存中。然后,您可以按所需方式修改实体。 ORM跟踪更改。刷新时,更改会反映到数据库中。

因此,您可以在内存中使用EF加载所有必需的实体。您可以遍历它们以更改属性,然后刷新上下文。

这里的问题是,这不是每个发言的批量更新;而是称为批处理更新。您一次更新单个记录。这严重影响了性能。

NHibernate提供了执行批量操作的替代方法(HQL,原始SQL)。但是,这些API不符合UoW。

使用EF,您可以使用ExecuteStoreCommand

  

使用现有连接直接对数据源执行任意命令。

  

如果存在当前事务,则在当前事务的上下文中执行store命令。

dbContext.ExecuteStoreCommand(sql, ....);

请记住,尽管这在当前事务下运行,但用尽了UoW。也就是说,它不会跟踪更改。如果已加载的实体是UPDATE命令的一部分,那么它们将处于不一致状态。