You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

能否为AbpAuditLogs表添加列?以ErrorCode为例说明实现方法

为AbpAuditLogs表添加ErrorCode列的可行方案

当然可以给AbpAuditLogs表新增ErrorCode列,下面我会分步骤讲解两种实现方式,以及如何将错误码传递到审计日志中:

方式一:使用对象扩展(推荐,无需修改实体类)

这种方式不需要创建自定义的审计日志实体,直接通过ABP的对象扩展机制添加列,更简洁:

1. 配置对象扩展与数据库列映射

在你的模块类(比如YourProjectNameModule)的ConfigureServices方法中,注册ErrorCode扩展属性:

Configure<AbpObjectExtensionOptions>(options =>
{
    options.AddOrUpdate<AbpAuditLog>(extension =>
    {
        extension.AddOrUpdateProperty<string>("ErrorCode"); // 定义扩展属性
    });
});

接着在你的DbContext的OnModelCreating方法中,把这个扩展属性映射到数据库列:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    // 配置ErrorCode列的属性,比如长度、是否必填
    builder.Entity<AbpAuditLog>(b =>
    {
        b.Property<string>("ErrorCode")
            .HasMaxLength(128)
            .IsRequired(false);
    });
}

2. 生成数据库迁移并更新

打开包管理器控制台,执行以下命令创建迁移并更新数据库:

Add-Migration AddErrorCodeColumnToAuditLogs
Update-Database

方式二:派生自定义AuditLog实体

如果你需要更复杂的扩展逻辑,可以创建自定义的审计日志实体继承自AbpAuditLog

1. 创建自定义AuditLog实体

public class CustomAuditLog : AbpAuditLog
{
    // 添加ErrorCode属性
    public string ErrorCode { get; set; }
}

2. 更新DbContext配置

在DbContext中替换默认的AuditLogs DbSet,并配置实体映射:

// 替换默认的DbSet类型
public DbSet<CustomAuditLog> AuditLogs { get; set; }

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<CustomAuditLog>(b =>
    {
        b.ToTable("AbpAuditLogs"); // 使用原表名,避免新建表
        b.ConfigureByConvention(); // 应用ABP的默认配置
        b.Property(x => x.ErrorCode)
            .HasMaxLength(128)
            .IsRequired(false);
    });
}

3. 执行数据库迁移

同样执行迁移命令更新数据库:

Add-Migration ReplaceAuditLogWithCustomEntity
Update-Database

如何传递ErrorCode到审计日志

不管用哪种方式,你都可以通过以下几种场景传递ErrorCode

场景1:在异常处理时自动记录

创建自定义的AuditLogContributor,拦截审计日志保存前的事件,从异常中提取错误码:

public class ErrorCodeAuditLogContributor : AuditLogContributor
{
    public override void PreSave(AsyncAuditLogSaveContext context)
    {
        // 获取当前审计日志中的第一个异常
        var exception = context.Exceptions.FirstOrDefault();
        if (exception is YourCustomBusinessException customEx)
        {
            // 方式一(对象扩展):添加到ExtraProperties
            context.AuditLogInfo.ExtraProperties["ErrorCode"] = customEx.ErrorCode;
            
            // 方式二(自定义实体):需要将AuditLogInfo转换为CustomAuditLog
            // 注意:如果用自定义实体,你可能需要配置AuditLogInfo到CustomAuditLog的映射,
            // 或者直接在PreSave中修改待保存的实体(需要额外处理)
        }
    }
}

然后在模块的ConfigureServices中注册这个Contributor:

Configure<AbpAuditingOptions>(options =>
{
    options.Contributors.Add<ErrorCodeAuditLogContributor>();
});

场景2:手动设置ErrorCode

在业务逻辑中,当你需要主动记录错误码时,可以通过IAuditingManager获取当前审计日志并设置:

public class YourBusinessService : ITransientDependency
{
    private readonly IAuditingManager _auditingManager;

    public YourBusinessService(IAuditingManager auditingManager)
    {
        _auditingManager = auditingManager;
    }

    public async Task DoBusinessLogicAsync()
    {
        try
        {
            // 你的业务逻辑
        }
        catch (Exception ex)
        {
            if (_auditingManager.Current.IsEnabled)
            {
                // 设置ErrorCode到当前审计日志
                _auditingManager.Current.Log.ExtraProperties["ErrorCode"] = "YOUR_ERROR_CODE_001";
            }
            throw;
        }
    }
}

内容的提问来源于stack exchange,提问作者Omital

火山引擎 最新活动