【问题标题】:How to soft delete one to many relationships in EF core?如何软删除 EF 核心中的一对多关系?
【发布时间】:2018-05-27 22:24:36
【问题描述】:

假设我有一个具有一对多关系的类别和产品实体,当我删除类别时,我想删除属于该类别的所有产品。通过删除,我的意思是将 IsDeleted 标志设置为 true,因为我不想真正删除它(我可以通过在删除级联上指定)。我找到了在删除 Category 时将 IsDeleted 设置为 true 的方法,但是我不知道如何找到该类别的产品并为它们做同样的事情。有什么帮助吗?

    public override int SaveChanges()
    {
        ChangeTracker.DetectChanges();

        foreach(var item in ChangeTracker.Entries<Category>().Where(e => e.State == EntityState.Deleted))
        {      
            item.State = EntityState.Modified;
            item.CurrentValues["IsDeleted"] = true;
        }

        return base.SaveChanges();
    }

我还指定了查询过滤器,这样我就不会得到删除的项目

    builder.Entity<Category>().Property<bool>("IsDeleted");
    builder.HasQueryFilter(c => !EF.Property<bool>(c, "IsDeleted"));

【问题讨论】:

  • 我认为 Category 实体具有 Products 命名属性,您可以从中获取属于该类别的产品列表。

标签: entity-framework entity-framework-6 entity-framework-core


【解决方案1】:

仅用于级联删除。当您删除类别时,该类别的所有产品也将根据导航属性标记为已删除。这将由 EFCore 自己完成。我在我的代码中使用这种方法来软删除一对多关系。然后使用(因此您的代码在产品上重复):

public override int SaveChanges()
{
    ChangeTracker.DetectChanges();

    foreach(var item in ChangeTracker.Entries<Category>().Where(e => e.State 
     == EntityState.Deleted))
    {      
        item.State = EntityState.Modified;
        item.CurrentValues["IsDeleted"] = true;
    }

    foreach(var item in ChangeTracker.Entries<Product>().Where(e => e.State 
     == EntityState.Deleted))
    {      
        item.State = EntityState.Modified;
        item.CurrentValues["IsDeleted"] = true;
    }

    return base.SaveChanges();
}

【讨论】:

  • 我尝试了这种方法,但它对我不起作用,我不知道为什么
  • 我也有同样的问题,似乎已删除实体的状态是修改而不是删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多