Audit.NET - Entity Framework - 使用 AuditScope 基于业务操作记录

Audit.NET - Entity Framework - Log Based on Business Action using AuditScope

我正在使用 Audit.NET 和 Entity Framework 使用 MVC 应用程序 运行 .NET 4.6.1.

实施审计

我希望能够审计影响多个实体的某些业务行为,而不是审计对实体的每一次修改。例如,如果一个用户被删除,那么我想记录每个将被修改的 table 。在此环境中,并非所有实体都设置有关系,因此我不能只包含对象图。我不想记录对电子邮件实体的每一次修改,只在删除员工时记录此数据。

我以为我可以使用 AuditScope.Create() 功能来处理这种情况,但我运气不好。

目前,我使用以下代码在启动时配置 Audit.NET。

    Audit.Core.Configuration.Setup()
        .UseEntityFramework(ef => ef
            .AuditTypeMapper(t => typeof(AuditLog))
            .AuditEntityAction<AuditLog>((ev, entry, entity) =>
            {
                entity.AuditData = entry.ToJson();
                entity.EntityType = entry.EntityType.Name;
                entity.AuditDate = DateTime.Now;
                entity.AuditUserId = SessionHelper.UserKey;
                entity.TablePk = entry.PrimaryKey.First().Value.ToString();
                entity.Duration = ev.Duration;
                entity.StartDate = ev.StartDate;
                entity.EndDate = ev.EndDate;
                entity.EventType = ev.EventType;
                entity.Action = entry.Action;
                entity.SchemaName = entry.Schema;
                entity.TableName = entry.Table;
                var entityFrameworkEvent = ev.GetEntityFrameworkEvent();
                entity.TransactionId = entityFrameworkEvent.TransactionId;
            })
        .IgnoreMatchedProperties(true));

在我的控制器操作中,我尝试通过 AuditScope 对象记录更改。我希望能够记录在使用中保存的任何对象的修改。

我已经尝试了几种不同的方法,但都没有成功。 Employee 只是我创建的一个 class 来包含我的各种实体,而不是映射到数据库的实际实体。

            var employee = new Employee();
            employee.Users = _db.Users.Where(x => x.EmpId == empid).ToList();
            employee.Emails = _db.Emails.Where(x => x.EmpId == empid).ToList();
            employee.Phones = _db.Phones.Where(x => x.EmpId == empid).ToList();

            using (AuditScope.Create("DeleteEmployee", () => employee))
            {
                _db.Users.RemoveRange(employee.Users);
                _db.Emails.RemoveRange(employee.Emails);
                _db.Phones.RemoveRange(employee.Phones);
                
                var EmployeeLog = new EmployeeLog
                {
                    ActionType = "Delete",
                    DeletedBy = ScopeUser.ID,
                    DeletedUser = employee.Users[0].UserName,
                    DeletedOn = DateTime.Now
                };

                _db.EmployeeLogs.Add(EmployeeLog);
                _db.SaveChanges();
            }    

这是我的员工 Class 定义:

[AuditInclude]
public class Employee
{
    public List<tbl_User> Users { get; set; }
    public List<tbl_Email> Emails { get; set; }
    public List<tbl_Phone> Phones { get; set; }
}

我也在不使用 Employee class 的情况下尝试了以下实现,但也没有记录任何内容。

var user = _db.Users.Where(x => x.EmpId == empid).ToList();
var emails = _db.Emails.Where(x => x.EmpId == empid).ToList();
var phones = _db.Phones.Where(x => x.EmpId == empid).ToList();

using (AuditScope.Create("DeleteEmployee", () => new { User = user, Emails = emails, Phones = phones }))
{
        _db.Users.RemoveRange(user);
        _db.Emails.RemoveRange(emails);
        _db.Phones.RemoveRange(phones);
        var EmployeeLog = new EmployeeLog
        {
             ActionType = "Delete",
             DeletedBy = ScopeUser.ID,
             DeletedUser = user[0].UserName,
             DeletedOn = DateTime.Now
         };

         _db.EmployeeLogs.Add(EmployeeLog);
         _db.SaveChanges();
}                

其他具有 [AuditInclude] 属性的实体正在按预期进行记录。要么我的配置不正确,您不能以这种方式混合使用 AuditScope 和 Audit.EntityFramework,要么 AuditScope 不打算用于跟踪多个实体。如能提供任何指导,我们将不胜感激。

请注意 EntityFramework Data Provider (.UseEntityFramework()) 将仅记录由 Audit.EntityFramework 库生成的审核事件。它将丢弃任何其他审计事件类型。

所以你不能让 Entity Framework 数据提供者记录通过 AuditScope.Create() 创建的任意事件(除非你手动创建一个 Audit.EntityFramework.AuditEventEntityFramework,但这没有什么意义)

看起来您正在将所有内容记录到同一个审核日志 table,因此您可以使用 SQL Data Provider 来记录任何类型的审核事件。

如果您需要使用多个数据提供程序(使用 Audit.EF 及其数据提供程序的 EF 日志记录,以及其他一些手动日志记录)请检查以下内容: