背景说明:我使用的后端是ABP,里面的数据库操作用的是EF Core.
我希望每次的数据变化,比如新增、修改、删除都记录到一个表(Audit)里面去.
之前已经实现效果了,但是这两天发现对数据的修改,根本不会写入到Audit表。
不知道问题出在哪里。数据保存是没有问题,但是就是无法记录修改部分。
大致的代码如下
private readonly IRepository<User, Guid> _userRepository;
。
。
。
User user = ObjectMapper.Map<User>(userDto);
//修改用户表中的某条记录
await _userRepository.UpdateAsync(user);
//使用DbContext().SaveChanges(),触发数据库变化事件
_userRepository.GetDbContext().SaveChanges();
然后在DBContext类中会接收数据变化事件
//数据变化,都会被这个方法拦截
public override async Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default)
{
AuditList = new List<Audit>();
var auditEntries = OnBeforeSaveChanges();
var result = await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
await OnAfterSaveChanges(auditEntries);
return result;
}
private List<AuditEntry> OnBeforeSaveChanges()
{
ChangeTracker.DetectChanges(); //捕获各个表数据的变化
var auditEntries = new List<AuditEntry>();
foreach (var entry in ChangeTracker.Entries())
{
//如果变数据没有发生实际的变化,则会continue; 但是目前的情况是,
//尽管数据发生了变化,entry.State依然是Unchanged,所以导致无法记录修改内容
if (entry.Entity is Audit || entry.State == EntityState.Detached || entry.State == EntityState.Unchanged)
continue;
var auditEntry = new AuditEntry(entry);
auditEntry.TableName = entry.Metadata.GetTableName();
auditEntries.Add(auditEntry);
foreach (var property in entry.Properties)
{
。。。 //对变化属性值的处理
}
}
// Save audit entities that have all the modifications
foreach (var auditEntry in auditEntries.Where(_ => !_.HasTemporaryProperties))
{
Audits.Add(auditEntry.ToAudit());
}
// keep a list of entries where the value of some properties are unknown at this step
return auditEntries.Where(_ => _.HasTemporaryProperties).ToList();
}
问题就出现在
if (entry.Entity is Audit || entry.State == EntityState.Detached || entry.State == EntityState.Unchanged)
continue;
中,数据修改之后EntityState.Unchanged还是true,正常情况是false才对,这样才能继续往下走,
继而记录数据变化部分
我的提问:会是什么原因导致,数据实际变化了,但是却捕获不到呢?有什么解决方案吗?
恳请大家帮忙指点,感谢!