如何对嵌套实体进行软删除以及如何理解我的类是否继承了特定的通用类

问题描述

我有一些嵌套实体需要软删除。 这是人员:

    public class Personnel : BaseIndelibleEntity<Guid>
{
    public string Name { get; set; }

    public string Surname { get; set; }

    public DateTime InDate { get; set; }

    public DateTime OutDate { get; set; }

    [ForeignKey("User")]
    public Guid UserId { get; set; }

    public GlobalUser User { get; set; }
}

这里是GlobalUser:

    public class GlobalUser : IdentityUser<Guid>,IBaseIndelibleEntity<Guid>
{
    public virtual Personnel Personnel { get; set; }

    public virtual Customer Customer { get; set; }

    public DateTime? DeletedDate { get; set; }

    public bool IsDeleted { get; set; } = false;

    public DateTime InsertedDate { get; set; } = DateTime.Now;

    public DateTime? UpdatedDate { get; set; }
}

这是我在DbContext中的软删除方法

        public override int SaveChanges()
    {
        SoftDelete();
        return base.SaveChanges();
    }

    public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
    {
        SoftDelete();
        return base.SaveChangesAsync(cancellationToken);
    }

    private void SoftDelete()
    {
        foreach(var e in ChangeTracker.Entries())
        {
            if(e.State == EntityState.Deleted && IsIndelibleEntity(e))
            {
                e.State = EntityState.Unchanged;
                e.Property("IsDeleted").CurrentValue = false;
                e.Property("IsDeleted").IsModified = true;
                e.Property("DeletedDate").CurrentValue = DateTime.Now;
                e.Property("DeletedDate").IsModified = true;
            }
        }
        bool IsIndelibleEntity(EntityEntry e) => typeof(IBaseIndelibleEntity<Guid>).IsAssignableFrom(e.Entity.GetType()) || typeof(IBaseIndelibleEntity<string>).IsAssignableFrom(e.Entity.GetType()) || typeof(IBaseIndelibleEntity<int>).IsAssignableFrom(e.Entity.GetType()) || typeof(IBaseIndelibleEntity<sbyte>).IsAssignableFrom(e.Entity.GetType());
    }

我的问题是,当我删除包含所包含的 GlobalUser 实体的人员时, GlobalUser 不会改变。因为当第一次在foreach语句中运行时,GlobalUser的输入状态更改为EntityState.Unchanged因为Personnel的输入状态已更改。因此,如果条件不能再次使用。 如何软删除嵌套实体。

2-另外我如何理解实体是否继承自IBaseIndelible 通用接口。我不想指定这样的特定类,例如IBaseIndelible。我已经编写了IsIndelibleEntity方法,但我不满意。您是否有任何想法要从Assembly或通过反射或其他任何方式自动获取它。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)