EF Core如何同步SQL Server更新触发器修改的列并保留列在更新语句中
解决EF Core中SQL Server触发器修改字段的同步问题
针对你遇到的SQL Server触发器修改字段后,EF Core无法同步最新值的问题,给你几个实用的解决办法:
方法一:配置属性的保存后行为
ValueGeneratedOnAddOrUpdate标记列由数据库生成(包括触发器修改),但默认EF不会自动刷新这个列的值。你可以在配置时加上AfterSaveBehavior = PropertySaveBehavior.Refresh,让EF在执行SaveChanges后自动查询该列的最新值同步到实体:
builder.Entity<PDBIntern.Models.PDB.Pfuscherakt>() .Property(p => p.Aktenzahl) .ValueGeneratedOnAddOrUpdate() .AfterSaveBehavior = PropertySaveBehavior.Refresh;
这样配置后,EF在执行Update语句后会自动追加查询获取Aktenzahl的最新值,不需要额外代码。
方法二:手动重新加载实体
如果上面的配置没生效,或者你需要同步多个触发器修改的字段,可以在保存后手动重新加载整个实体:
// 找到要更新的实体 var pfuscherakt = await _context.Pfuscherakt.FindAsync(yourEntityId); // 修改实体的其他属性 pfuscherakt.SomeField = "更新值"; // 保存变更 await _context.SaveChangesAsync(); // 重新加载实体,获取触发器修改后的所有字段 await _context.Entry(pfuscherakt).ReloadAsync();
这种方式简单直接,能确保实体的所有属性都和数据库同步。
方法三:手动查询指定列(按需同步)
如果只需要同步触发器修改的特定列,不想加载整个实体,可以在保存后单独查询该列的值并赋值给实体:
var pfuscherakt = await _context.Pfuscherakt.FindAsync(yourEntityId); pfuscherakt.SomeField = "更新值"; await _context.SaveChangesAsync(); // 只查询触发器修改的Aktenzahl列 var updatedAktenzahl = await _context.Pfuscherakt .Where(p => p.Id == pfuscherakt.Id) .Select(p => p.Aktenzahl) .FirstOrDefaultAsync(); pfuscherakt.Aktenzahl = updatedAktenzahl;
补充说明
ValueGeneratedOnAddOrUpdate让EF在Update语句中排除该列是合理的——因为这个列是由数据库触发器修改的,EF不需要把它放到SET子句里。我们要做的只是让EF在更新完成后去获取这个列的最新值,上面的几种方法都能实现这个需求,你可以根据场景选择。
内容的提问来源于stack exchange,提问作者Mad Rian
相关产品推荐
相关产品推荐

