如何让EF Core生成含主键与Year列双重条件的Update语句?
EF Core更新时将Year列加入更新条件的实现方法
有两种常用方法可以生成你需要的带id和year条件的UPDATE语句:
方法一:使用ExecuteUpdate直接批量更新(EF Core 7及以上版本支持)
这种方式不需要先查询实体,直接构造条件执行更新,效率更高:
await dbContext.Persons .Where(p => p.Id == 1 && p.Year == 2024) .ExecuteUpdateAsync(s => s.SetProperty(p => p.Name, "tom"));
EF Core会直接生成你想要的SQL:
update person set name = 'tom' where id = 1 and year = 2024
方法二:将Year标记为并发令牌,基于跟踪实体更新
如果你的业务需要先查询实体再修改,可以把Year列配置为并发令牌,EF Core更新时会自动将其加入WHERE条件,同时还能实现乐观并发检查:
步骤1:配置并发令牌(Fluent API方式)
在DbContext的OnModelCreating方法里配置实体:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Person>() .Property(p => p.Year) .IsConcurrencyToken(); }
步骤2:查询并修改实体
var person = await dbContext.Persons.FirstOrDefaultAsync(p => p.Id == 1 && p.Year == 2024); if (person != null) { person.Name = "tom"; await dbContext.SaveChangesAsync(); }
执行后生成的UPDATE语句同样会包含id和year作为条件,同时如果更新时Year值已被其他操作修改,EF Core会抛出DbUpdateConcurrencyException,适合需要并发控制的场景。
内容的提问来源于stack exchange,提问作者laowei
相关产品推荐
相关产品推荐

