c# - 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 个具有相同配置的表,但只有这个有这个问题。配置相同,主表和审计表的属性相同。
解决方案
推荐阅读
- r - filling missing values with mean/max of previous 16 days values
- android - android camera2 API - 如何将缩小设置为超宽
- python - 熊猫枢轴使用列作为后缀
- sharepoint - 我想从 nextcloud 切换到 sharepoint 或 onedrive
- c# - 参数数量未知的 C# 字符串格式
- android-room - OnConflictStrategy.REPLACE 对更新和插入的工作方式是否相同?
- python - 从拥抱脸权重构建张量流模型的问题
- c++ - 为什么执行时会跳过前 2 个字符?C++
- python - 如何根据另一个数据框中的值替换一个数据框中列中的某些值,以多列为条件
- php - 如何读取数据库?