【发布时间】:2016-05-15 06:20:37
【问题描述】:
好的,这里发生了很多事情,我不想用冗长的代码示例让你们厌烦,所以这里是摘录...
当在我的 EF 上下文中调用 SaveChangesAsync() 时,我让它调用此方法来审核每个条目...
async Task Audit(DbEntityEntry<IAmAuditable> entry)
{
try
{
var newAuditEntry = new AuditEntry
{
EntityType = entry.Entity.GetType().Name,
Event = entry.State.ToString(),
SSOUserId = kernel.Get<User>().Id,
EntityId = entry.GetId().ToString(),
EventId = eventId
};
如果有问题的条目是一个实体创建,这将导致在 db i 上插入,那么也这样做...
var properties = entry.CurrentValues.PropertyNames.Select(p => entry.Property(p)).ToList();
var addedValues = new List<AuditDataItem>();
foreach (var p in properties)
{
addedValues.Add(new AuditDataItem
{
PropertyName = p.Name,
PreviousValue = null,
NewValue = p.CurrentValue.ToString()
});
}
newAuditEntry.Changes = addedValues;
break;
...这是它失败的地方...当时尚未执行对 SaveChanges 的基本调用,因此相关实体还没有主键值...最终结果是我记录了一个没有主要实体的实体的创建。
有没有人建议以一种干净的方式来处理这个问题,以便我可以将新的主键值放入 AuditDataItem 中?
编辑:
这是我目前作为 json 记录的示例,这是一个单独的 AuditEntry 对象和一些子 AuditDataItem 行的一部分...
{
"Id": 4,
"SSOUserId": 1,
"EventId": "6d862aad-0898-4794-aea0-00af6f2994ff",
"EntityType": "AC_Programme",
"Event": "Added",
"TimeOfEvent": "2016-02-04T12:04:31.5501508+01:00",
"Changes": [
{
"Id": 34,
"PropertyName": "Id",
"PreviousValue": null,
"NewValue": "0"
},
{
"Id": 35,
"PropertyName": "Name",
"PreviousValue": null,
"NewValue": "Test"
},
...
]
}
【问题讨论】:
标签: c# entity-framework entity audit-logging