C# Audit.NET-实体框架-基于使用AuditScope的业务操作的日志

C# Audit.NET-实体框架-基于使用AuditScope的业务操作的日志,c#,entity-framework,audit.net,C#,Entity Framework,Audit.net,我正在使用Audit.NET和实体框架实现审计,并使用运行.NET4.6.1的MVC应用程序 我希望能够审计影响多个实体的某些业务操作,而不是审计对实体的每一次修改。例如,如果删除了一个用户,那么我希望记录将要修改的每个表。在这个环境中,并不是所有的实体都设置了关系,所以我不能只包含对象图。我不想记录对电子邮件实体的每次修改,只要在删除员工时记录这些数据即可 我想我可以使用AuditScope.Create()功能来处理这个场景,但我没有任何运气 目前,我使用以下代码在启动时配置Audit.NE

我正在使用Audit.NET和实体框架实现审计,并使用运行.NET4.6.1的MVC应用程序

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

我想我可以使用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));
以下是我的员工类定义:

[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; }
}
其他具有[AuditionInclude]属性的实体正在按预期进行日志记录。或者我的配置不正确,您不能以这种方式混合使用AuditScope和Audit.EntityFramework,或者AuditScope不用于跟踪多个实体。如果您能提供任何指导,我们将不胜感激。

注意(
.UseEntityFramework()
)将只记录由
audit.EntityFramework
库生成的审核事件。它将丢弃任何其他审核事件类型

因此,您不能让实体框架数据提供程序记录通过
AuditScope.Create()
创建的任意事件(除非手动创建
Audit.EntityFramework.AuditEventEntityFramework
,但这没有什么意义)

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

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


谢谢!我能够让SQL数据提供程序工作,但最终决定只使用EntityFramework数据提供程序,并使用记录的其他数据。
[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; }
}
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();
}