C#实体框架:使用Where和Join进行批量更新

C#实体框架:使用Where和Join进行批量更新,c#,.net,entity-framework,linq,asp.net-core,C#,.net,Entity Framework,Linq,Asp.net Core,如何使用实体框架核心中的Join和Where子句更新中的某些记录?使用下面的模板答案(附加/修改) “如果您不想使用SQL语句,您可以使用Attach方法更新实体,而不必先加载它。因为默认情况下它是以不变的方式附加的。您需要调用makeisModified=true” 当前要求: var data = _dbContext.Set<Product>() .Include(c => c.ProductType) .Where(x => x.Manufactu

如何使用实体框架核心中的Join和Where子句更新中的某些记录?使用下面的模板答案(附加/修改)

“如果您不想使用SQL语句,您可以使用Attach方法更新实体,而不必先加载它。因为默认情况下它是以不变的方式附加的。您需要调用make
isModified=true

当前要求:

var data = _dbContext.Set<Product>()
    .Include(c => c.ProductType)
    .Where(x => x.Manufacturer == "ABC Company" &&
                x.StartYear == 2019 &&
                x.ProductType.ProductTypeDescription == "Electronics")

data.Manufacturer = "XYZ Company";
data.StartYear = 2020;
_dbContext.SaveChangesAsync();
使用EF Net Core 3.1


现在不会接受使用原始sql或EF扩展的答案,只接受本机EF核心。如果EF扩展不存在,那怎么办

await\u dbContext.Set()
.其中(x=>x.制造商==“ABC公司”&&
x、 StartYear==2019&&
x、 ProductType.ProductTypeDescription==“电子产品”)
.BatchUpdateSync(x=>new Product(){
制造商=“XYZ公司”,
StartYear=2020});
注意:更新是作为原始sql执行的,加载到更改跟踪器中的对象不会更新。您可能希望在事务中围绕批量操作和
savechangesync


YMMV,我自己没有使用过这个库。

EF Core只跟踪单个项目的更改,没有生成批量更新的方法。因此,您必须允许其他答案。hi@JeremyLakeman,因此我只能更新数据库中的所有记录,没有where子句?基本上,SaveChanges会根据附着到更改跟踪器的各个对象的主键生成更新语句。因此,您需要加载所有对象,更改值,然后保存。“这显然是低效的。”杰里曼好吧,我认为这个答案可以避免所有这些?它避免了更改跟踪并防止加载所有实体如果您知道要更新的所有行的主键,则可以将它们附加到上下文而不加载它们。如果您不支持,那么EF Core不支持为“批量更新”生成sql。我只允许本机EF Core解决方案,并在问题中说,没有扩展,谢谢许可证是MIT,所以您可以免费复制粘贴源代码。虽然我可以阅读
BulkExtensions
源代码,并在so答案中解释它是如何工作的,你想解决的问题很复杂。其他人已经解决了这个问题。他们允许您免费使用和分发他们的解决方案。所以,我愿意这么做。嗨,我有一个后续问题,谢谢你的帮助
using (myDbEntities db = new myDbEntities())
{
    try
    {
      db.Configuration.AutoDetectChangesEnabled = false;

      MyObjectEntity entityToUpdate = new MyObjectEntity() {Manufacturer = "XYZ Company", StartYear =2020};
      db.Entry(entityToUpdate).Property(e => e.Manufacturer).IsModified = true;
      db.Entry(entityToUpdate).Property(e => e.StartYear).IsModified = true;

      db.SaveChanges();
    }
    finally
    {
      db.Configuration.AutoDetectChangesEnabled = true;
    }
}