Blazor应用中EF取消实体修改后避免SaveChanges提交的方法
解决Blazor中EF Core实体取消修改后仍被跟踪的问题
针对你遇到的Scoped上下文下,修改实体后取消更改但ChangeTracker仍保留变更记录、调用SaveChanges会同步到数据库的问题,有以下几种可行的解决方式:
重新加载实体(推荐)
使用EF Core的ReloadAsync方法直接从数据库拉取实体的最新状态,覆盖本地跟踪的实体,同时将其状态重置为Unchanged:await _yourDbContext.Entry(yourEntity).ReloadAsync();这个操作会彻底同步本地实体与数据库状态,清除所有未提交的变更记录。
手动重置状态与原始值
如果不想从数据库重新加载,可以先将实体的当前值恢复为ChangeTracker记录的原始值,再将状态设为Unchanged:var entityEntry = _yourDbContext.Entry(yourEntity); // 将当前属性值恢复为修改前的原始值 entityEntry.CurrentValues.SetValues(entityEntry.OriginalValues); // 标记实体状态为未修改 entityEntry.State = EntityState.Unchanged;脱离上下文跟踪
如果后续不需要再跟踪该实体,可以直接将其从ChangeTracker中移除:_yourDbContext.Entry(yourEntity).State = EntityState.Detached;注意:脱离跟踪后,该实体后续的属性变更不会被EF Core监控,若需再次跟踪需要手动调用
Attach方法。
内容的提问来源于stack exchange,提问作者Chardeux
相关产品推荐
相关产品推荐

