我们使用如下实体:
public class Audit
{
[Required]
[StringLength(6)]
public string Action { get; set; }
public string Changes { get; set; }
public string PK { get; set; }
[Required]
public DateTime RevisionStamp { get; set; }
[Required]
[StringLength(50)]
public string TableName { get; set; }
[Required]
[StringLength(50)]
public string Username { get; set; }
}
我们用它来审计我们所有的表。 Action 属性表示发生了什么类型的更改,例如“更新”、“插入”或“删除”。更改前后的列值以 JSON 格式保存在 Changes 列中,如下所示:
[{"FieldName":"ID","ValueBefore":"2","ValueAfter":"2"},{"FieldName":"SettingTypeIndex","ValueBefore":"FiscalYear","ValueAfter":"FiscalYear"},{"FieldName":"Value","ValueBefore":"2015","ValueAfter":"2016"},{"FieldName":"Year","ValueBefore":"0","ValueAfter":"0"},{"FieldName":"DateInserted","ValueBefore":"2016-04-11 8:45:08 AM","ValueAfter":"2016-04-11 8:45:08 AM"},{"FieldName":"DateModified","ValueBefore":"2016-07-28 9:45:46 AM","ValueAfter":"2016-07-28 9:47:17 AM"},{"FieldName":"CreatorUserID","ValueBefore":"b44792db-1fbd-44d2-9f7d-cf05c6a2f922","ValueAfter":"b44792db-1fbd-44d2-9f7d-cf05c6a2f922"},{"FieldName":"UpdaterUserID","ValueBefore":"b44792db-1fbd-44d2-9f7d-cf05c6a2f922","ValueAfter":"b44792db-1fbd-44d2-9f7d-cf05c6a2f922"}]
这样我们就可以拥有回滚功能(如果需要)。更改记录的主键保存在PK 属性中。更改日期保存在RevisionStamp 属性中,最后表名和用户名分别保存在TableName 和Username 属性中。当然,这个实体被映射到数据库中的一个表,并且数据被持久化在那个表中。
如果您使用实体框架,您可以覆盖 DbContext.SaveChanges() 方法并获取所有 ChangeTracker.Entries().Where(e=>e.State != EntityState.Unchanged) 项目并使用这些项目创建您的审计数据。