首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF核中的软删除嵌套实体

EF核中的软删除嵌套实体
EN

Stack Overflow用户
提问于 2020-11-30 17:55:31
回答 2查看 1.4K关注 0票数 1

我有一些嵌套的实体,当我软删除记录时,我想要自动删除记录的子记录(就像硬删除)。我该怎么做?最好的方法是什么?

代码语言:javascript
复制
class Base
{
    bool isDeleted { set; get; }
}

class A : Base
{
    //Collection of B
}

class B : Base
{
    //Collection of C
}

class C : Base
{
    //Collection of D
}
....

例如:

表A:

代码语言:javascript
复制
    Id    ForeignKey(B Id)    isDeleted 
    -------------------------------------
    1        1                 false

表B:

代码语言:javascript
复制
   Id    ForeignKey(C Id)    isDeleted
   -------------------------------------
    1        1                 false
    1        2                 false
    1        3                 false

表C:

代码语言:javascript
复制
    Id    ForeignKey(D Id)    isDeleted
    -------------------------------------
    1        1                 false
    1        2                 false
    2        3                 false
    2        4                 false
    3        5                 false
    3        6                 false

代码:

代码语言:javascript
复制
public void SoftDeleteA()
{
     //A.isDeleted = true;
     //???How to soft-delete related records in B,C,D ,...
     //SaveChanges();
}

现在,当我从A中软删除行时,B和C的所有行也必须被软删除。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-30 19:03:53

没有用实体框架自动实现这一目标的方法。软删除只是一个术语,它并不实际删除记录,而是只更新单个列值,因此没有相关实体受此影响。但是,您可以使用实体框架或SQL触发器来完成此操作。由于您希望这种情况自动发生,所以在表A上创建一个更新触发器,并从更新的记录中在相关表中设置isDeleted。

与触发有关的条款:

https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-ver15

https://www.tutorialgateway.org/after-update-triggers-in-sql-server/

https://www.sqlshack.com/triggers-in-sql-server/

https://www.aspsnippets.com/Articles/Simple-Insert-Update-and-Delete-Triggers-in-SQL-Server-with-example.aspx

使用实体框架,您需要先将父和所有子对象一起获取,然后单独修改它们并保存到数据库中。

示例:

代码语言:javascript
复制
public A FetchA()
{
  return _context.A
          .Include(a=>a.CollectionB)
          .ThenInclude(b=>b.CollectionC)
          .FirstOrDefaultAsync();
}

public void SoftDeleteA()
{
    var a = FetchA();
    if(a !=null)
    {
       a.isDeleted = true;

       // loop through all related records and update them
       if(a.CollectionB?.Any()== true)
       { 
           foreach(var itemB in a.CollectionB)
           {
               itemB.isDeleted = true;

               // loop through all related records and update them
               if(itemB.CollectionC?.Any()== true)
               { 
                   foreach(var itemC in itemB.CollectionC)
                   {
                       itemC.isDeleted = true;
                   }         
               }
           }
       }

       // save changes at last
       _context.Update(a);
       await _context.SaveChangesAsync() ;
    }

}

或者,如果您可以选择使用SQL,只需运行原始sql,这比使用EF快得多。

示例:

代码语言:javascript
复制
update b
set isDeleted = a.isDeleted
from B b
inner join A a on b.ID = a.ID
票数 1
EN

Stack Overflow用户

发布于 2021-10-16 15:47:46

我用的是类似递归函数的东西;

代码语言:javascript
复制
class Base
{
      public virtual bool IsDeleted { get; set; }
      public virtual void DeleteMethod(int modifiedBy)
      {
          IsDeleted = true;
          ModifiedMethod(modifiedBy);
      }
}

class A : Base
{
    //Collection of B
    
    public override void DeleteMethod(int modifiedBy)
    {
        B.ForEach(oe => oe.DeleteMethod(modifiedBy));
        base.DeleteMethod(modifiedBy);
    }
}

class B : Base
{
    //Collection of C
    
    public override void DeleteMethod(int modifiedBy)
    {
        C.ForEach(oe => oe.DeleteMethod(modifiedBy));
        base.DeleteMethod(modifiedBy);
    }
}

class C : Base
{
    //Collection of D
    
    public override void DeleteMethod(int modifiedBy)
    {
        D.ForEach(oe => oe.DeleteMethod(modifiedBy));
        base.DeleteMethod(modifiedBy);
    }
}

当调用一些{ParentClass}.DeleteMethod(),时,它对子类的开始操作。同样的事情,上面的答案,但涵盖所有继承的类,不需要写循环再次每个方法。

代码语言:javascript
复制
public async Task SoftDeleteAsync()
{
    ..
    A.DeleteMethod(userid);
    await context.SaveChangesAsync();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65078681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档