Audit.net 数据模型示例

Jad*_*ric 5 sqlite audit.net entity-framework-core-2.1

有没有人有一个关于如何将审计模型添加到现有项目(Audit.Net)的工作示例。

这是一个非常棒的组件,到目前为止,我和我的团队已经习惯了标准 JSON 文件,但是,我们希望将当前的解决方案迁移到 Xamarin 应用程序,并且希望将审核存储在设备上的本地 SQLite 数据库。

但是,该项目的文档有些缺乏,并且没有关于如何使用实体框架进行自定义审核的简明示例。

我们已经处理了 github 存储库上的 MD 文件,但仍然无法进行审核。

另一个与此类似的问题已在此处提出,但没有明确的示例说明 Audit_{entity} 表应该是什么样子、它必须包含哪些字段以及如何为其设置关系。

我们尝试将 JSON 文件逆向工程为关系结构,但在提出这个问题时,我们还没有得到任何写入 SQLite 数据库的审核。

the*_*000 4

抱歉,该文档没有太大帮助,希望我(或任何人)将来能够提供更好的文档。

我假设您正在使用EntityFramework将实体映射到SQLite数据库,并且您希望使用EF 数据提供程序 将审核事件存储在同一数据库的 Audit_{entity} 表中。

只要 {entity} 表与其 Audit_{entity} 表之间存在一对一关系,您要用于 Audit_{entity} 表的架构就没有限制。然后可以通过多种方式配置映射。

Audit_{entity} 表的建议是具有与审核的 {entity} 表相同的列,以及所需的任何常见附加列,例如在接口上定义的 aUser和 a 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;
        });
Run Code Online (Sandbox Code Playgroud)

请注意,该接口不是强制性的,但使用它可以使配置更清晰。另请注意,如果您愿意,您可以使 Audit_{entity} 继承自 {entity}。


更新

也许我一开始的假设是不正确的,您不是在审计EF 实体,而是在审计任何其他类型的审计。如果是这种情况,您需要的是一个将审核事件存储到 SQLite 数据库中的数据提供程序。

目前,还没有存储到 SQLite 的内置数据提供程序,如果有的话,它只会在一列中存储事件的 JSON 表示形式(如 SQL / MySql提供程序)。但看起来您想要一个自定义架构,因此您需要实现自己的数据提供程序。

检查此处的文档。

以下是数据提供者的示例框架:

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 
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你只需设置它:

Audit.Core.Configuration.Setup()
    .UseCustomProvider(new SQLiteDataProvider());
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回复。首先,你的产品确实是独一无二的,项目审计并不是真正有效地完成的事情,而我发现这个产品是天赐之物。我想做的是,将所有跟踪写入一个名为 AuditTrail 的表,而不管 {entity} 是什么,这就是我正在努力解决的问题。查看文档并尝试构建通用的audit_trail表,似乎根本不起作用。基本上,我想将 JSON 输出复制到单个表中。你现在解释的方式可能会帮助我解决这个问题。再次感谢。 (2认同)