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 日志记录,以及其他一些手动日志记录)请检查以下内容:
我正在使用 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 日志记录,以及其他一些手动日志记录)请检查以下内容: