Audit.NET Entity Framework 审计两个表的同一个条目
Audit.NET Entity Framework to audit one same entry to two tables
我有 2 个审计 table,一个是 Audit_ProfileFan,第二个是 Audit_StatusChanges
第一个 table AuditProfileFan
应该在每次对 ProfileFan Table 进行更新或插入时进行审核。
第二个 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;
})
)
);
但每次更新时它只审核一个 table 在这种情况下 Audit_ProfileFan。
我的要求是可行的还是我应该做一些解决方法?
当前版本的 EntityFramework data provider 无法做到这一点,因为您只能从已知的 实体类型 进行映射。
但是 我找到了一种方法来允许这种用例的影响最小,方法是添加一个新的 Map<T>
重载,让您指定最终审计类型作为 EventEntry 的函数,因此您可以将相同的输入数据类型映射到多个输出审计类型,具体取决于修改后的条目。
例如,您可以根据 SQL 操作 (insert/update) 将 ProfileFan
映射到不同的表,像这样:
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
开始的库中
我有 2 个审计 table,一个是 Audit_ProfileFan,第二个是 Audit_StatusChanges
第一个 table AuditProfileFan
应该在每次对 ProfileFan Table 进行更新或插入时进行审核。
第二个 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;
})
)
);
但每次更新时它只审核一个 table 在这种情况下 Audit_ProfileFan。
我的要求是可行的还是我应该做一些解决方法?
当前版本的 EntityFramework data provider 无法做到这一点,因为您只能从已知的 实体类型 进行映射。
但是 我找到了一种方法来允许这种用例的影响最小,方法是添加一个新的 Map<T>
重载,让您指定最终审计类型作为 EventEntry 的函数,因此您可以将相同的输入数据类型映射到多个输出审计类型,具体取决于修改后的条目。
例如,您可以根据 SQL 操作 (insert/update) 将 ProfileFan
映射到不同的表,像这样:
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