从用户删除角色后,我需要跟踪谁做的(即哪个AbpUser)以及他们何时做的。
显而易见的解决方案是重新定义UserRole实体,以便它继承自FullAuditedEntity而不是CreationAuditedEntity,但是UserRole实体是在nuget包中定义的,因此我不能简单地更改定义。
有没有办法实现我没有看到的这种行为?
这是到目前为止我尝试过的。
方法1:我尝试在数据库级别上通过在AbpUserRole表上设置删除触发器来处理此问题,该触发器将在AbpUserRoleDeleted表中插入一条记录,但我想不出一种方法来找出哪个AbpUser进行了删除用这种方法。我只能跟踪动作发生的时间。
方法2:我尝试在UserRole实体上侦听EntityDeleted域事件,但似乎未触发。有趣的是,当我从用户中删除角色时,会触发EntityUpdated事件,但是即使假设仅当删除UserRole时才触发该事件,事件数据仍不包括进行删除的人员。如果是这样,我可以像将数据库删除触发器一样手动将审核信息保存在单独的表中,但是这次我将拥有负责删除的AbpUser。
方法3:我尝试按照步骤here扩展UserRole实体。我能够实现IDeletionAudited接口并生成一个迁移,以在AbpUserRoles表上创建关联的列,但是从用户中删除角色将执行硬删除而不是软删除,因此我无法确定列是否被填充。我假设他们没有。
方法4:我尝试为UserRole实体启用Entity History,但它似乎仅跟踪何时创建UserRole实体。
//src\aspnet-core\src\Company.App.EntityFrameworkCore\EntityFrameworkCore\AppDbContext.cs
namespace Company.App.EntityFrameworkCore
{
public class AppDbContext : AbpZeroDbContext<Tenant, Role, User, AppDbContext>, IAbpPersistedGrantDbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
ChangeTracker.StateChanged += OnEntityStateChanged;
}
private void OnEntityStateChanged(object sender, EntityStateChangedEventArgs e)
{
if (e.Entry.Entity is UserRole && e.NewState == EntityState.Deleted)
{
//update instead of delete
e.Entry.State = EntityState.Modified;
e.Entry.CurrentValues["IsDeleted"] = true;
e.Entry.CurrentValues["DeletionTime"] = DateTime.Now;
e.Entry.CurrentValues["DeleterUserId"] = AbpSession.UserId;
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//use query filter on the `IsDeleted` shadow property
modelBuilder.Entity<UserRole>().HasQueryFilter(p => !EF.Property<bool>(p, "IsDeleted"));
modelBuilder.Entity<UserRole>().Property<bool>("IsDeleted");
modelBuilder.Entity<UserRole>().Property<DateTime?>("DeletionTime").IsRequired(false);
modelBuilder.Entity<UserRole>().Property<long?>("DeleterUserId").IsRequired(false);
}
}
}