对于Audit.Net,没有人有一个如何将审计模型添加到现有项目的有效示例。
这是一个极好的组件,到目前为止,我和我的团队已经了解了标准的JSON文件,但是,我们希望将当前的解决方案迁移到Xamarin应用程序中,并希望将其存储设备上本地SQLite数据库中的审核。
但是,该项目的文档有所欠缺,并且没有简洁的示例说明如何使用Entity Framework进行自定义审核。
我们已经遍历了github存储库上的MD文件,但是仍然无法进行审核。
又问了一个类似的问题HERE,但没有明确的示例说明Audit_ {entity}表应该是什么样,它必须包含哪些字段以及如何为其建立关系
我们试图将JSON文件反向工程为关系结构,但是在问这个问题时,我们还没有进行任何审计以写入SQLite数据库。
答案 0 :(得分:3)
很抱歉文档没有太大帮助,希望我(或任何人)将来可以提供更好的文档。
我假设您正在使用 EntityFramework 映射您的实体 到 SQLite 数据库,并且您想使用 EF data provider 将审核事件存储在Audit_ {entity}表中的同一数据库中。
只要您的{entity}表及其Audit_ {entity}表之间具有一对一的关系,对要用于Audit_ {entity}表的架构就没有限制。然后可以通过多种方式配置映射。
对于Audit_ {entity}表的建议是与已审计的{entity}表具有相同的列,并需要任何常见的附加列,例如在{_1}}和User
上定义界面。
因此,如果您所有的Audit_ {entity}表都具有与其{entity}相同的列/属性,并且添加了一些公共列(在接口上定义),则可以这样配置:
Date
请注意,该接口不是强制性的,但使用该接口可使配置更整洁。另外请注意,如果您愿意,可以使Audit_ {entity}继承自{entity}。
也许我一开始的假设是不正确的,并且您不是审核EF实体,但您正在审核其他任何类型的审核。在这种情况下,您正在寻找的是Data Provider,它将审核事件存储到SQLite数据库中。
目前,没有内置数据提供程序可存储到SQLite,如果有,则它将仅将事件的JSON表示形式存储在一列中(例如SQL / { {3}}个提供商)。但是看起来您想要一个自定义架构,因此您将需要实现自己的数据提供程序。
查看文档MySql。
这是数据提供者的示例框架:
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;
});
然后您只需设置以下内容:
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
}
}