首页 > 解决方案 > Audit.NET 检测到外键属性“AuditQuantitativeResearch.AuditId”已更改

问题描述

在我的项目中,我有很多表,并且正在使用 Audit.NET 来跟踪记录中的所有更改。它运作良好。我有一个漫长的过程,我将 Excel 文件中的每一行保存到数据库中。在生产环境中,我发现了这个错误

外键属性“AuditQuantitativeResearch.AuditId”被检测为已更改。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看属性值。

{"AspNetCoreEnvironment":"Production","OriginalFormat":"外键属性 '{entityType}.{property}' 被检测为已更改。考虑使用 'DbContextOptionsBuilder.EnableSensitiveDataLogging' 来查看属性值。","CategoryName": "Microsoft.EntityFrameworkCore.ChangeTracking","EventName":"Microsoft.EntityFrameworkCore.ChangeTracking.ForeignKeyChangeDetected","EventId":"10803","entityType":"AuditQuantitativeResearch","property":"AuditId"}

在此处输入图像描述

这会导致一个非常长的过程,并且该过程不会在数据库中保存任何内容。

表的定义就像

public class QuantitativeResearch : ITable
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long ID { get; set; }
    public DateTime CreatedAt { get; set; } = DateTime.Now;

    // more properties
}

和这个连接的审计表是

public class AuditQuantitativeResearch : IAudit
{
    [Key]
    public long AuditId { get; set; }

    public long ID { get; set; }
}

添加新记录的基础存储库是这样的

public async Task<T> AddAsync(T entity)
{
    _log.LogDebug($"[{nameof(T)}] Adding a new record");

    try
    {
        _db.Entry(entity).State = EntityState.Added;
        await _db.Set<T>().AddAsync(entity);
        _db.SaveChanges();
    }
    catch (Exception ex)
    {
        _log.LogError(ex, "Adding a new record");
    }

    return entity;
}

审计和所有添加/更新/删除都适用于所有其他实体。在开发环境(某些服务器不是 IIS 下的生产但不同的池)和本地,该过程也可以使用此表。

更新

这是 Audit.NET 的配置

public static IServiceCollection ConfigureAudit(
       this IServiceCollection serviceCollection, 
       string connString)
{
    #region Use this when you have another table for audit

    Audit.Core.Configuration.Setup()
        .UseEntityFramework(ef => ef.AuditTypeExplicitMapper(m => m
            .Map<QuantitativeResearch, AuditQuantitativeResearch>()
            .AuditEntityAction<IAudit>((evt, entry, auditEntity) =>
            {
                auditEntity.AuditDate = DateTime.UtcNow;
                auditEntity.UserName = evt.Environment.UserName;
                auditEntity.AuditAction = entry.Action;
            }))); ;

    #endregion Use this when you have another table for audit

    return serviceCollection;
}

这些是我正在使用的包

<ItemGroup>
  <PackageReference Include="Audit.EntityFramework.Core" Version="18.1.5" />
  <PackageReference Include="Audit.NET" Version="18.1.5" />
  <PackageReference Include="Audit.NET.SqlServer" Version="18.1.5" />
  <PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.9" />
  <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.9">
    <PrivateAssets>all</PrivateAssets>
    <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
  </PackageReference>
  <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.9" />
  <PackageReference Include="Microsoft.Extensions.Logging" Version="5.0.0" />
  <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>

作为旁注,我有其他 101 个具有相同配置的表,但只有这个有这个问题。配置相同,主表和审计表的属性相同。

标签: c#asp.net-coreaudit.net

解决方案


推荐阅读