EF Core全局统一修改实体

在DBContext类下,重写SaveChangesAsync方法,并插入修改实体逻辑,参考代码如下:

public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))
{
    OnBeforeSaving();
    return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
}
private void OnBeforeSaving()
{
    foreach (var entry in ChangeTracker.Entries())
    {
        var entityType = entry.Entity.GetType();

        // 软删除逻辑
        if (typeof(ISoftDelete).IsAssignableFrom(entityType))
        {
            if (entry.State == EntityState.Deleted)
            {
                entry.State = EntityState.Modified;
                entry.CurrentValues["isdeleted"] = true;
            }
        }

        // 自动更新时间与更新人
        if (entry.State == EntityState.Modified)
        {
            // 判断是否有 LastModificationTime 属性
            var lastModificationTimeProp = entry.Properties.FirstOrDefault(p => p.Metadata.Name == "LastModificationTime");
            if (lastModificationTimeProp != null)
            {
                lastModificationTimeProp.CurrentValue = DateTimeOffset.UtcNow;
            }

            // 判断是否有 Updater 属性
            var updaterProp = entry.Properties.FirstOrDefault(p => p.Metadata.Name == "Updater");
            if (updaterProp != null)
            {
                // 你可以根据实际情况获取当前用户
                updaterProp.CurrentValue = "system"; // 或 _currentUser.UserName
            }

            // 判断是否有 UpdaterName 属性
            var updaterNameProp = entry.Properties.FirstOrDefault(p => p.Metadata.Name == "UpdaterName");
            if (updaterNameProp != null)
            {
                // 你可以根据实际情况获取当前用户名称
                updaterNameProp.CurrentValue = "系统"; // 或 _currentUser.Name
            }
        }
    }
}
posted @ 2025-06-10 14:13  Cody&  阅读(20)  评论(0)    收藏  举报