C# efcore>;删除实体(软删除)>;实体国家保持不变

C# efcore>;删除实体(软删除)>;实体国家保持不变,c#,delete-row,ef-core-3.1,C#,Delete Row,Ef Core 3.1,在我的通用基础存储库中,我有以下从数据库中删除实体的简单方法: public async Task<bool> DeleteAsync(TKey id) { var item = await Context.Set<TDb>().FindAsync(id).ConfigureAwait(false); if (item == null) return null; var result

在我的通用基础存储库中,我有以下从数据库中删除实体的简单方法:

    public async Task<bool> DeleteAsync(TKey id)
    {
        var item = await Context.Set<TDb>().FindAsync(id).ConfigureAwait(false);
        if (item == null)
            return null;

        var result = Context.Set<TDb>().Remove(item);
        await Context.SaveChangesAsync().ConfigureAwait(false);

        return result.State == EntityState.Modified || result.State == EntityState.Deleted;
    }
一切正常,
IsDeleted
属性正在数据库中成功设置;然而,当我检查我的
结果.State
时,它告诉我实体状态是
未更改的
(这导致我的deleteAasync返回
false
),我不太明白这一点。即使在代码中,也可以看到我将状态从
Deleted
更改为
Modified


我当然可以忽略这一点,而是在保存更改后返回纯true(如果出现错误,它将在之前失败);然而,我只是想理解为什么我会得到这个意想不到的状态结果。非常感谢您在这方面提供的任何帮助。

添加的
修改的
删除的
都是挂起状态,表明调用
保存更改{Async}
时EF Core将如何处理该实体
ChangeTracker.HasChanges()
当存在任何具有这种状态的实体条目时,返回true

默认情况下(
acceptAllChangesOnSuccess=true
参数
SaveChanges{Async}
),在成功
SaveChanges
后,这些状态将更新以反映这些实体的永久(数据库)状态<代码>已添加和
已修改
变为
未更改
已删除
变为
已分离
(并且条目从更改跟踪器中删除)和
更改跟踪器。HasChanges()
返回false

您可以通过将
acceptAllChangesOnSuccess=false
传递到
SaveChanges{Async}
来更改它,在这种情况下,您将看到挂起状态,但是您不应该忘记调用
ChangeTracker.AcceptAllChanges()
,否则下一个
SaveChanges{Async}
将尝试在数据库中重新应用它们(而且很可能会失败)

public class EfCoreDbContext : DbContext, IUnitOfWork
{
    public EfCoreDbContext(
        DbContextOptions options
        IConfiguration configuration) : base(options)
    {
    }

    public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
    {
        ChangeTracker.SetShadowISoftDeletableProperties();
        ChangeTracker.SetShadowIUserOwnableProperties(UserResolver);
        ChangeTracker.SetShadowIAuditableProperties(UserResolver);
        return await base.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
    }
}
    public static void SetShadowISoftDeletableProperties(this ChangeTracker changeTracker)
    {
        changeTracker.DetectChanges();
        foreach (var entry in changeTracker.Entries())
        {
            if (typeof(ISoftDeletable).IsAssignableFrom(entry.Entity.GetType()))
            {
                if (entry.State == EntityState.Deleted)
                {
                    entry.State = EntityState.Modified;
                    entry.Property("IsDeleted").CurrentValue = true;
                }
                else if (entry.State == EntityState.Added)
                {
                    entry.Property("IsDeleted").CurrentValue = false;
                }
                else
                {
                    entry.Property("IsDeleted").CurrentValue = entry.Property("IsDeleted").OriginalValue;
                }
            }
        }
    }