在数据层而不是单层应用程序中进行审核

时间:2019-02-21 09:38:19

标签: c# asp.net-mvc audit multi-layer

这是我的第一种任务,我正在使用本教程。 Link

区别在于本教程是在单层中完成的,因此可以轻松访问Identity属性。

我的项目有

  1. 数据库上下文所在的数据层(以及所有模型dbset)
  2. 引用了数据,服务和表示层的实体(模型)
  3. 引用表示层的服务
  4. 演示层

问题是我将审计模型放在实体层中,但是在本教程中,它具有AspNetUsers表的外键,并且代码优先迁移没有通过。

he ForeignKeyAttribute on property 'AuditUserId' on type 'Namespace.Entities.AuditActions.Audit' is not valid. The navigation property 'AuditUser' was not found on the dependent type 'Namespace.Entities.AuditActions.Audit'. The Name value should be a valid navigation property name

第二个问题是我无法从放置了保存替代的数据层访问用户信息。

var currentUser = OwinContextHelper.CurrentApplicationUser;

我无法从放置替代的数据层访问位于表示层中的OwinHelpper类。

如何在应用程序中实现本教程?

任何想法都会受到欢迎。

对我来说,一个初级开发人员很容易:)

1 个答案:

答案 0 :(得分:1)

尝试解决第二个问题:

对于这种用例,我会推荐Audit.NET / Audit.EF库(实际上我想您已经在使用它了)。

您可以使用Custom Action来避免信息从表示层传递到数据层。该库使您可以参与审计创建,并且可以将该代码放在表示层上,例如:

class Presentation
{
    void StartUp()
    {
        // Use SqlServerDataProvider to store the audit events on SQL
        Audit.Core.Configuration.Setup()
            .UseSqlServer(_ => _
                .ConnectionString("...")
                .TableName("Event")
                .IdColumnName("EventId")
                .JsonColumnName("Data"));

        // Add a custom action to have a custom field 
        Audit.Core.Configuration.AddOnCreatedAction(scope =>
        {
            scope.SetCustomField("OwinUser", OwinContextHelper.CurrentApplicationUser);
        });
    }
}