EF使用UpdateAsync更新实体报错The query must be of type ObjectQuery or DbQuery如何解决
问题原因排查
- 你调用的
UpdateAsync不是EF Core官方原生支持的方法:EF Core 7.0及以上版本才原生提供批量更新能力,对应方法为ExecuteUpdateAsync。如果你使用的EF Core版本低于7.0,或是误调用了旧版Entity Framework、第三方不兼容ORM扩展包提供的UpdateAsync方法,就会触发入参类型校验失败,抛出该报错。 - 小概率场景:你的
_appDbContext.Dog属性没有正确声明为DbSet<Dog>类型,导致后续查询返回的实例不符合扩展方法的入参要求。
修复方案
方案1:升级EF Core到7.0及以上版本,使用原生批量更新方法
修改更新逻辑为原生ExecuteUpdateAsync写法即可:
public async Task<bool> UpdateDog(Dog dog) { try { await _appDbContext.Dog .Where(d => d.Id == dog.Id) .ExecuteUpdateAsync(d => d .SetProperty(x => x.DogName, dog.DogName) .SetProperty(x => x.DogAge, dog.DogAge) ); return true; } catch(Exception exception) { // 可在此处添加异常日志逻辑方便后续排查 return false; } }
方案2:不升级EF Core版本,使用传统EF更新逻辑
如果暂时无法升级EF Core版本,改用先查询实体再修改保存的写法即可:
public async Task<bool> UpdateDog(Dog dog) { try { var existingDog = await _appDbContext.Dog.FirstOrDefaultAsync(d => d.Id == dog.Id); if (existingDog == null) { return false; } existingDog.DogName = dog.DogName; existingDog.DogAge = dog.DogAge; await _appDbContext.SaveChangesAsync(); return true; } catch(Exception exception) { // 可在此处添加异常日志逻辑方便后续排查 return false; } }
方案3:使用兼容的第三方扩展库
如果你确实想要使用UpdateAsync的写法,可安装和你当前EF Core版本匹配的Z.EntityFramework.Plus.EFCore包,安装完成后原有代码即可正常运行。
内容的提问来源于stack exchange,提问作者Yeshan Santhush
相关产品推荐
相关产品推荐

