我try 在EventEntryChange对象的OriginalValue和NewValue属性中(可能也在ColumnValues对象中)设置相关实体的名称.我try 使用格式和覆盖选项,如下所示(只是为了显示它而简化的代码):
Audit.EntityFramework.Configuration.Setup()
.ForContext<AppDbContext>(config => config
.ForEntity<Product>(prodConfig =>
{
prodConfig.Format(x => x.ProductType, value =>
{
// Get name from related object
var name = relatedObject?.Name;
return name ?? value;
});
})
);
在这两种情况下,它都会用更新后的值替换OriginalValue,但NewValue和ColumnValues条目将重置为外键ID.这是因为DbConextHelper中的代码:
/// <summary>
/// Updates column values and primary keys on the Audit Event after the EF save operation completes.
/// </summary>
public void UpdateAuditEvent(EntityFrameworkEvent efEvent, IAuditDbContext context)
{
// Update PK and FK
foreach (var efEntry in efEvent.Entries)
{
var entry = efEntry.Entry;
efEntry.PrimaryKey = GetPrimaryKey(context.DbContext, entry);
foreach (var pk in efEntry.PrimaryKey)
{
if (efEntry.ColumnValues.ContainsKey(pk.Key))
{
efEntry.ColumnValues[pk.Key] = pk.Value;
}
}
var fks = GetForeignKeys(context.DbContext, entry);
foreach (var fk in fks)
{
if (efEntry.ColumnValues.ContainsKey(fk.Key))
{
efEntry.ColumnValues[fk.Key] = fk.Value;
}
var change = efEntry.Changes?.FirstOrDefault(e => e.ColumnName == fk.Key);
if (change != null)
{
change.NewValue = fk.Value;
}
}
}
// Update ConnectionId
var clientConnectionId = TryGetClientConnectionId(context.DbContext);
if (clientConnectionId != null)
{
efEvent.ConnectionId = clientConnectionId;
}
}
老实说,我真的不确定它为什么要对审计条目这样做,但我相信肯定有原因.然而,我仍然在试图弄清楚如何才能使日志(log)工作,或者甚至是类似的东西(例如,添加一个单独的更改来保存链接实体的名称),以满足我的需求.