Entity framework 更新实体而不读取EF core中的整个实体

Entity framework 更新实体而不读取EF core中的整个实体,entity-framework,asp.net-core,updates,core,Entity Framework,Asp.net Core,Updates,Core,当我们只有主键时,是否可以只更新特定属性,我不想读取现有的完整实体。我认为这可以通过 如下 但是在EF核心中有没有不使用SQL查询的更新方法 注:典型方式 阅读现有图书实体 更新名称 3然后保存更改 但是,当我们需要更新20k记录时,这种典型的方法成本更高EF并不真正适合批量操作,尽管它是工具带中的一种工具,因此当面临不适合电钻的要求时,拔出螺丝刀进行更精细的控制是完全正确的 如果您需要执行批量更新,例如更新状态或日期,或者跨大量行执行其他静态更改,那么将其编写为语句并使用ExecuteSqlC

当我们只有主键时,是否可以只更新特定属性,我不想读取现有的完整实体。我认为这可以通过 如下

但是在EF核心中有没有不使用SQL查询的更新方法

注:典型方式

  • 阅读现有图书实体
  • 更新名称 3然后保存更改

  • 但是,当我们需要更新20k记录时,这种典型的方法成本更高

    EF并不真正适合批量操作,尽管它是工具带中的一种工具,因此当面临不适合电钻的要求时,拔出螺丝刀进行更精细的控制是完全正确的

    如果您需要执行批量更新,例如更新状态或日期,或者跨大量行执行其他静态更改,那么将其编写为语句并使用ExecuteSqlCommand跨数据库执行它并没有什么错。这里需要注意的是,如果这些记录中的任何一条恰好是您可能正在使用的DbContext中的跟踪实体,则需要刷新这些记录,并在执行命令后从数据库重新加载它们以查看更改

    如果您需要对大量行执行逻辑检查,并且希望在代码中执行该检查,而不是像SQL或存储过程这样的操作,那么另一个选项是使用具有最小实体定义的作用域DbContext,批量加载实体并保存它们。例如,如果您有一个由100列(不包括关系)组成的实体,并且您只需要4列来涵盖您需要检查和更新的内容,那么您可以定义一个DbContext,以便使用仅包含这四列的实体定义来处理更新。可以成批地从update DbContext中读取这些数据,即一次读取1000-10000行,然后在调用
    SaveChanges()
    ,然后转储并重新创建下一批的DbContext实例之前,将其输入到一个方法中进行验证和更新。这种方法的警告是事务性的,因为如果更新失败,只会回滚该批。由于实体占用空间较小,系统可能一次更新大量实体(可能是所有实体),但这需要监控性能成本。大容量操作最好安排在工作时间之后,以避免在繁忙期间临时触发时在数据库上造成读锁/死锁或繁重的事务操作

    using(var context = new SampleContext())
    {
        var commandText = "Update Book SET Name='WhatEver' WHERE id=@id";
        var name = new SqlParameter("@id", "10001");
        context.Database.ExecuteSqlCommand(commandText, name);
    }