在.Net核心Web应用程序中,我使用Audit.EntityFramework 16.1.1.net core 3.1来记录更改,用于两个目的:

  • 记录特定表的更改以用于历史/安全和
  • 将所有更改记录到一个表中(计划的作业(job)定期删除该表),以便在需要时进行一些基本的取证.

Startup.cs中使用的代码如下:

var currentUser = app.ApplicationServices.GetRequiredService<ICurrentUser>();

Audit.Core.Configuration.Setup()
    .UseEntityFramework(ef => ef
        .AuditTypeMapper(t => typeof(AuditLog))
        .AuditEntityAction<AuditLog>((ev, entry, entity) =>
        {
            entity.Id = Guid.NewGuid();
            entity.AuditData = entry.ToJson();
            entity.EntityType = entry.EntityType.Name;
            entity.AuditDate = DateTime.Now;
            entity.AuditUsername = currentUser.GetUsername();
            entity.AuditUserId = currentUser.GetUserId();
            entity.EntityId = entry.PrimaryKey.Count > 1 ?
                string.Join("|", entry.PrimaryKey.Select(pk => pk.Value)) :
                entry.PrimaryKey.First().Value.ToString();
            entity.Action = entry.Action;
        })
        .IgnoreMatchedProperties(true));

Audit.Core.Configuration.Setup()
    .UseEntityFramework(ef => ef
        .AuditTypeExplicitMapper(m => m
        .Map<Table1, Table1History>((table, tableHistory) =>
        {
            FillTableHistoryData(table, tableHistory);
        })
        .Map<Table2, Table2History>((otherTable, otherTableHistory) =>
        {
            FillOtherTableHistoryData(otherTable, otherTableHistory);
        })

在将应用程序升级到.net core 6Audit.EntityFramework19.1.0(或任何更新版本)后,这就停止了工作.返回到16.1.1.会抛出MethodNotFoundException(对于GetTableName方法).

所以,我想避免一些严重的重构,同时让它像以前一样工作.在这方面有经验的人能给我一个正确的方向吗?

推荐答案

我不知道为什么它在旧版本中有效,但你不应该调用 .UseEntityFramework()次,因为它每次都会覆盖设置.

一种 Select 是在AuditTypeExplicitMapper中使用.MapExplicit来处理.Map<>调用中不包含的表.

例如:

Audit.Core.Configuration.Setup()
    .UseEntityFramework(ef => ef
        .AuditTypeExplicitMapper(m => m
            .Map<Table1, Table1History>((table, tableHistory) =>
            {
                FillTableHistoryData(table, tableHistory);
            })
            .Map<Table2, Table2History>((otherTable, otherTableHistory) =>
            {
                FillOtherTableHistoryData(otherTable, otherTableHistory);
            })
            .MapExplicit<AuditLog>(entry => IsAnotherTable(entry), (entry, entity) =>
            {
                entity.Id = Guid.NewGuid();
                entity.AuditData = entry.ToJson();
                entity.EntityType = entry.EntityType.Name;
                // ...
            }))
        .IgnoreMatchedProperties(true));

您需要指定.MapExplicit将处理哪些实体,例如:

bool IsAnotherTable(EventEntry entry)
{
    return entry.GetEntry().Entity is not Table1 and not Table2;
}

Csharp相关问答推荐

如何从顶部提取发票号作为单词发票后的第一个匹配

找不到网址:https://localhost:7002/Category/Add?区域= Admin.为什么我的URL是这样生成的?area = Admin而不是/Admin/

当我使用NET6作为目标框架时,为什么DotNet使用NET8作为MS包?

通过条件列表删除/更新EF Core 7中的实体的有效方法

Blazor-从数据库内部服务器提取错误

UWP中的任务和界面

如何解决提交按钮后 Select 选项错误空参照异常

C#DateTime.ParseExact不使用特定日期

在swagger示例中添加默认数组列表

什么时候接受(等待)信号灯?尽可能的本地化?

C#按名称从类获取属性值类型<;t>;,我需要反射吗?

在使用UserManager时,如何包含与其他实体的关系?

我找不到ASP.NET Web应用程序(.NET框架).已 Select .NET框架项目和项模板以及此组件(&Q;)

.NET8Blazor-为什么Rapzor渲染在for循环之后显示?

岛屿和框架中的自定义控件库.Navigate-AccessViolationException

仅在ASP.NETCore应用程序中的附加单独端口上公开一组终结点

映射器-如何映射到多个实体

无效的Zip文件-Zip存档

实例化列表时的集合表达式是什么?

现在是否有一个.NET SDK等效于AsyncEx的AsyncLock?