entity-framework - Audit.NET Entity Framework 审核两个表的同一条目

标签 entity-framework audit audit.net

我有 2 个审核表,第一个是 Audit_ProfileFan,第二个是 Audit_StatusChanges 第一个表 AuditProfileFan 应在每次对 ProfileFan 表进行更新或插入时进行审核。 第二个 Audit_StatusChanges 应该仅在更新特定列 FanStatusId 时进行审核。

Audit.Core.Configuration.Setup() .UseEntityFramework(ef => ef.AuditTypeExplicitMapper(m => m
        .Map<FanActivity, Audit_FanActivity>((fanActivity, auditFanActivity) =>
        {
            auditFanActivity.ProfileFanId = fanActivity.ProfileFanId;
            auditFanActivity.ActivityId = auditFanActivity.ActivityId;

        })
        .Map<DeliveryActions, Audit_DeliveryActions>((deliveryAction, auditDeliveryAction) =>
        {
            auditDeliveryAction.ProfileFanId = deliveryAction.FanId;
            auditDeliveryAction.DeliveryActionId = deliveryAction.DeliveryActionId;
        })
        .Map<Fan, Audit_Fan>()
        .Map<ProfileFan, Audit_StatusChanges>((profileFan, auditStatusChanges) =>
        {
            auditStatusChanges.ProfileFanId = profileFan.Id;
            //auditStatusChanges.OriginalValue = profileFan.FanStatusId;
            //auditStatusChanges.NewValue = profileFan.FanStatusId;
        })
        .Map<ProfileFan, Audit_ProfileFan>((profileFan, auditProfileFan) =>
        {
            auditProfileFan.ProfileFanId = profileFan.Id;
            auditProfileFan.FanId = profileFan.FanId;
            auditProfileFan.EmailResponseStatusId = profileFan.EmailResponseStatusId;
            auditProfileFan.FanStatusId = profileFan.FanStatusId;
        })
        .Map<TagFan, Audit_TagFan>((tagFan, auditTagFan) =>
        {
            auditTagFan.ProfileFanId = tagFan.ProfileFanId;
            auditTagFan.TagId = tagFan.TagId;
        })
        .AuditEntityAction<IAuditLog>((evt, entry, auditEntity) =>
        {
            if(entry.Table=="ProfileFan" && entry.Action=="Update")
            {
                //auditEntity.OriginalValue = profileFan.FanStatusId;
                //auditEntity.NewValue = profileFan.FanStatusId;
            }

            auditEntity.AuditDate = DateTime.Now;
            auditEntity.AuditUser = evt.Environment.UserName;
            auditEntity.Action = entry.Action; // Insert, Update, Delete
            auditEntity.AuditUsername = HttpContext.Current.User.Identity.Name;
        })
    )
);

但每次进行更新时,它仅审核一个表(在本例中为 Audit_ProfileFan)。

我的要求是否可行或者我应该采取某种解决方法?

最佳答案

当前版本的 EntityFramework data provider 不可能做到这一点,因为您只能从已知的实体类型进行映射,而不能从其他类型进行映射。

但是我找到了一种方法,通过添加新的 Map<T> 来允许此类用例的影响最小。重载,使您可以将最终审核类型指定为 EventEntry 的函数。 ,因此您可以将相同的输入数据类型映射到多个输出审核类型,具体取决于修改的条目。

例如,您可以映射 ProfileFan根据 SQL 操作(插入/更新)到不同的表,如下所示:

Audit.Core.Configuration.Setup() 
    .UseEntityFramework(ef => ef.AuditTypeExplicitMapper(m => m
        .Map<ProfileFan>(
            mapper: entry => entry.Action == "Insert" ? typeof(Audit_ProfileFan) : typeof(Audit_StatusChanges), 
            entityAction: (ev, entry, entity) =>
            {
                if (entity is Audit_ProfileFan pf)
                {
                    // action for profile fan
                    // pf.xxxx = ...;
                }
                else if (entity is Audit_StatusChanges ss)
                {
                    // action for status changes
                    // ss.xxxx = ...;
                }
            })
        .Map<TagFan, Audit_TagFan>(/*...*/)
        .AuditEntityAction<IAuditLog>((evt, entry, auditEntity) =>
        {
            // common action...
        })));

即将发布,here是进行更改的提交。

更新

这包含在 Audit.EntityFramework 中库从版本 14.6.2 开始

关于entity-framework - Audit.NET Entity Framework 审核两个表的同一条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57326801/

相关文章:

asp.net-mvc - 我们可以从现有数据库的选定表中构建 DbContext 吗

audit - pubnub channel 审核未显示赠款

asp.net-core - ASP.NET Core 实体变更历史

c# - Audit.NET 连接对象保存问题

Audit.Net:在不同数据提供者中保存的过程

c# - 首先通过代码更新具有一对一关系的 ViewModel

sql-server - Entity Framework : how to find transaction isolation level in SQL Profiler?

visual-studio - 在所选文件中找不到从 DbContext 派生的可构造类型(EF Power Tools Beta 3/Visual Studio 2012)

database - 更改日志/审计数据库表的最佳设计?

html - 当 ol 元素具有角色时,可访问性审核失败