我需要知道使用EF Core或Dapper从所有行更新单列的最佳方法是什么。我想这叫做批量更新。
我尝试了EF Plus,但在阅读了有关许可证试用版后便卸载了该软件,并且正在Dapper或Entity Framework中寻找一种免费的方法。
我想,尽管我认为是否必须编写原始SQL或创建存储过程很重要。
答案 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命令的一部分,那么它们将处于不一致状态。