EF Core>删除实体(软删除)>实体状态保持不变

罗伯特·J。

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

    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;
    }

然后在我的数据库上下文中,我以下列方式在保存更改异步中设置了阴影属性(就像微软建议的那样)(简化代码以提高清晰度):

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);
    }
}

SaveChangesAsync方法上可以看出,我已经将阴影属性用于其他跟踪项,例如审核或用户所有权,而这些属性可以正常工作。

最后,这是负责设置软删除的Change Tracker代码

    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;
                }
            }
        }
    }

一切正常,IsDeleted在数据库中成功设置了属性;但是,当我检查自己的时result.State,它告诉我实体状态为Unchanged(这导致我的DeleteAsync返回false),我不太了解。即使在可见的代码中,我也将状态从更改DeletedModified

我可以肯定地忽略它,而是在保存更改后返回纯真(如果发生错误,它将在此之前失败);但是我只是想了解为什么我得到这种意外状态结果。在这方面的任何帮助将不胜感激。

伊万·斯托夫

AddedModified以及Deleted处于待处理状态,表明EF Core在SaveChanges{Async}被调用时将对该实体执行的操作。ChangeTracker.HasChanges()当存在任何具有这种状态的实体条目时,返回true。

默认情况下(的acceptAllChangesOnSuccess=true参数SaveChanges{Async}),成功后,SaveChanges将更新这些状态以反映这些实体永久(数据库)状态。Added并且Modified成为UnchangedDeleted成为Detached(并且条目已从变更跟踪器中删除)并ChangeTracker.HasChanges()返回false。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

删除实体导致验证错误EF6

来自分类Dev

删除与EF6有多对多关系的实体记录

来自分类Dev

实体框架5软删除

来自分类Dev

动态实体EF5创建和*删除或回收* TypeBuilder

来自分类Dev

删除&shy; (软连字符)来自元素的实体

来自分类Dev

为什么EF在分离时会删除子实体?

来自分类Dev

EF Core:更新实体而不先查询

来自分类Dev

EF Core:更新对象图重复子实体

来自分类Dev

EF Core-不加载所有子实体

来自分类Dev

使用Include加载相关数据实体ef Core 3.1

来自分类Dev

如何使用EF Core中的DbContext基类访问实体?

来自分类Dev

当所需的关系为空时,为什么EF Core会删除实体?

来自分类Dev

EF Core 3.0:实体中的多个导航属性

来自分类Dev

只读表/实体EF Core 3.0

来自分类Dev

软删除EF Core中的嵌套实体

来自分类Dev

实体框架6.1-如何查询软删除的记录?

来自分类Dev

在EF Core中添加或更新实体

来自分类Dev

对EF Core中的所有实体运行查询

来自分类Dev

无法删除需要父属性的ef实体

来自分类Dev

删除与EF6有多对多关系的实体记录

来自分类Dev

实体框架:软删除和每种类型的表

来自分类Dev

EF-从上级实体删除关系

来自分类Dev

Symfony2,KnpLabs学说行为:如何真正删除可软删除的实体?

来自分类Dev

EF Core 更新无法跟踪实体类型“广告”的实例

来自分类Dev

EF Core 访问嵌套嵌套实体

来自分类Dev

EF Core - 实体映射配置

来自分类Dev

从 EF Core 中的子实体获取最大值

来自分类Dev

EF Core 是否可以在非最高投影中跟踪实体?

来自分类Dev

EF Core:计算实体的多级子级的数量