问题描述
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; }
}
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 (将#修改为@)