【问题标题】:Audit.net data models exampleAudit.net 数据模型示例
【发布时间】:2019-01-26 06:11:57
【问题描述】:

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

这是一个很棒的组件,到目前为止,我和我的团队都使用标准 JSON 文件,但是,我们希望将当前的解决方案迁移到我们的 Xamarin 应用程序,并希望存储设备上本地 SQLite 数据库中的审计。

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

我们已经处理了 github repo 上的 MD 文件,但我们仍然无法让审计工作。

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

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

【问题讨论】:

  • Audit_{entity} 模式仅在审计 EntityFramework 时适用。那是你要找的吗? EF data provider?

标签: sqlite entity-framework-core-2.1 audit.net


【解决方案1】:

很抱歉文档没有提供太多帮助,希望我(或任何人)将来可以提供更好的文档。

我假设您正在使用 EntityFramework 来映射您的实体 到 SQLite 数据库,并且您想使用 EF data provider 将审计事件存储在同一数据库的 Audit_{entity} 表中。

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

建议 Audit_{entity} 表具有与已审计 {entity} 表相同的列,并需要任何常见的附加列,例如在接口上定义的 UserDate

因此,如果您的所有 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());

【讨论】:

  • 感谢您的回复。首先,你的产品是真正独特的,项目中的审计并不是真正有效的,我发现这个产品是天赐之物。我想要做的是,将所有跟踪,无论 {entity} 写入一个名为 AuditTrail 的表,这就是我正在努力解决的问题。查看文档并尝试构建一个通用的 audit_trail 表,似乎根本不起作用。基本上,我想将 JSON 输出复制到一个表中。您现在解释的方式可能会帮助我解决这个问题。再次感谢。
  • 您还可以将多个实体类型映射到同一个审计类型。 Here is an example
猜你喜欢
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
相关资源
最近更新 更多