aierda 2023-05-26 11:45 采纳率: 75.9%
浏览 63
问题最晚将于06月03日00:00点结题

数据修改之后EntityState.Unchanged还是true

背景说明:我使用的后端是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才对,这样才能继续往下走,
继而记录数据变化部分

我的提问:会是什么原因导致,数据实际变化了,但是却捕获不到呢?有什么解决方案吗?
恳请大家帮忙指点,感谢!

  • 写回答

8条回答 默认 最新

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

      • 创建了问题 5月26日

      悬赏问题

      • ¥15 vivado如何支持多维打包数组模式
      • ¥15 请问第13题到底应该怎么做
      • ¥15 stable diffusion报错问题
      • ¥20 数据可视化综合运用 导入npz文件以及读取内容
      • ¥15 倒计时汇编语言RTC实时时钟
      • ¥15 CCS安装出现Failed to create the part's controls
      • ¥15 请问有digital Fortran编译器吗
      • ¥15 用cst怎么仿真同轴馈线
      • ¥15 如何在lammps中添加气液边界条件?
      • ¥20 具有每日记账功能的简易日历程序