很抱歉文档没有提供太多帮助,希望我(或任何人)将来可以提供更好的文档。
我假设您正在使用 EntityFramework 来映射您的实体
到 SQLite 数据库,并且您想使用 EF data
provider
将审计事件存储在同一数据库的 Audit_{entity} 表中。
只要您的 {entity} 表与其 Audit_{entity} 表之间存在一对一的关系,您要用于 Audit_{entity} 表的架构就没有任何限制。然后可以通过多种方式配置映射。
建议 Audit_{entity} 表具有与已审计 {entity} 表相同的列,并需要任何常见的附加列,例如在接口上定义的 User 和 Date。
因此,如果您的所有 Audit_{entity} 表都具有与其 {entity} 相同的列/属性,并且您添加了一些公共列(在接口上定义),则可以这样设置配置:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Audit_User : IAudit
{
public int Id { get; set; }
public string Name { get; set; }
// IAudit members:
public string AuditUser { get; set; }
public datetime AuditDate { get; set; }
public string Action { get; set } // "Insert", "Update" or "Delete"
}
Audit.Core.Configuration.Setup()
.UseEntityFramework(x => x
.AuditTypeNameMapper(typeName => "Audit_" + typeName)
.AuditEntityAction<IAudit>((ev, ent, auditEntity) =>
{
auditEntity.AuditDate = DateTime.UtcNow;
auditEntity.AuditUser = evt.Environment.UserName;
auditEntity.AuditAction = ent.Action;
});
注意接口不是强制性的,但是使用它可以使配置更清晰。另请注意,如果您愿意,您可以让 Audit_{entity} 从您的 {entity} 继承。
更新
也许我一开始的假设是不正确的,您不是审核 EF 实体,而是任何其他类型的审核。如果是这种情况,您正在寻找的是一个Data Provider,它将审计事件存储到您的 SQLite 数据库中。
目前,没有存储到 SQLite 的内置数据提供程序,如果有,它将仅将事件的 JSON 表示形式存储在一列中(如SQL/MySql提供者)。但看起来您想要一个自定义架构,因此您需要实现自己的数据提供程序。
查看文档here。
这是一个数据提供者的示例框架:
public class SQLiteDataProvider : AuditDataProvider
{
public override object InsertEvent(AuditEvent auditEvent)
{
// Insert the event into SQLite and return its ID
}
public override void ReplaceEvent(object eventId, AuditEvent auditEvent)
{
// Replace the event given its ID (only used for CreationPolicies InsertOnStartReplaceOnEnd and Manual)
}
// async implementation:
public override async Task<object> InsertEventAsync(AuditEvent auditEvent)
{
// Asynchronously insert the event into SQLite and return its ID
}
public override async Task ReplaceEventAsync(object eventId, AuditEvent auditEvent)
{
// Asynchronously replace the event given its ID
}
}
然后你只需设置它:
Audit.Core.Configuration.Setup()
.UseCustomProvider(new SQLiteDataProvider());